#load("E16_Dec7v3_Trachea.RData")
basal, secretory, and ciliated:
table(E16_Dec7v3_epi@meta.data$res.1.2)

   1   13   17   19   20    4    6    7    9 
1849  566  333  263  235 1362 1072  887  749 
colnames(E16_Dec7v3_epi@meta.data)[colnames(E16_Dec7v3_epi@meta.data) == 'res.0.8'] <- 'orig.0.8'
colnames(E16_Dec7v3_epi@meta.data)[colnames(E16_Dec7v3_epi@meta.data) == 'res.1.2'] <- 'orig.1.2'
E16_Dec7v3_epi <- ScaleData(object = E16_Dec7v3_epi)
Scaling data matrix

  |                                                                                                                                                               
  |                                                                                                                                                         |   0%
  |                                                                                                                                                               
  |=======                                                                                                                                                  |   5%
  |                                                                                                                                                               
  |==============                                                                                                                                           |   9%
  |                                                                                                                                                               
  |=====================                                                                                                                                    |  14%
  |                                                                                                                                                               
  |============================                                                                                                                             |  18%
  |                                                                                                                                                               
  |===================================                                                                                                                      |  23%
  |                                                                                                                                                               
  |==========================================                                                                                                               |  27%
  |                                                                                                                                                               
  |=================================================                                                                                                        |  32%
  |                                                                                                                                                               
  |========================================================                                                                                                 |  36%
  |                                                                                                                                                               
  |===============================================================                                                                                          |  41%
  |                                                                                                                                                               
  |======================================================================                                                                                   |  45%
  |                                                                                                                                                               
  |============================================================================                                                                             |  50%
  |                                                                                                                                                               
  |===================================================================================                                                                      |  55%
  |                                                                                                                                                               
  |==========================================================================================                                                               |  59%
  |                                                                                                                                                               
  |=================================================================================================                                                        |  64%
  |                                                                                                                                                               
  |========================================================================================================                                                 |  68%
  |                                                                                                                                                               
  |===============================================================================================================                                          |  73%
  |                                                                                                                                                               
  |======================================================================================================================                                   |  77%
  |                                                                                                                                                               
  |=============================================================================================================================                            |  82%
  |                                                                                                                                                               
  |====================================================================================================================================                     |  86%
  |                                                                                                                                                               
  |===========================================================================================================================================              |  91%
  |                                                                                                                                                               
  |==================================================================================================================================================       |  95%
  |                                                                                                                                                               
  |=========================================================================================================================================================| 100%
E16_Dec7v3_epi <- FindVariableGenes(object = E16_Dec7v3_epi, do.plot = TRUE, x.low.cutoff=0.1,x.high.cutoff = Inf, y.cutoff = 0.5)
Calculating gene means
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Calculating gene variance to mean ratios
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|

run PCA on the set of genes
E16_Dec7v3_epi <- RunPCA(object = E16_Dec7v3_epi, do.print = FALSE)
#PCAPlot(E16_Dec7v3_epi)
E16_Dec7v3_epi <- ProjectPCA(object = E16_Dec7v3_epi, do.print = F)

n.pcs.sub = 17
res.used <- 1.2
E16_Dec7v3_epi <- FindClusters(object = E16_Dec7v3_epi, reduction.type = "pca", dims.use = 1:n.pcs.sub, 
                     resolution = res.used, print.output = 0, force.recalc = T)
E16_Dec7v3_epi <- RunTSNE(object = E16_Dec7v3_epi, dims.use = 1:n.pcs.sub, perplexity=30)

get tSNE embedding for velocyto:
E16_Dec_cv3_ID<-read.csv(file="E16_Dec_cv3_ID.csv",header=F,sep=",",stringsAsFactors = F) 
head(E16_Dec_cv3_ID)
E16_Dec_cv3_name<-gsub("x","",E16_Dec_cv3_ID)
head(E16_Dec_cv3_name)
E16_Dec_cv3_name<-gsub(":","_",E16_Dec_cv3_name)
head(E16_Dec_cv3_name)
TSNE1_Loomorder_epi<-E16_Dec7v3_epi@dr$tsne@cell.embeddings[match(E16_Dec_cv3_name,rownames(E16_Dec7v3_epi@dr$tsne@cell.embeddings)),1]
write(TSNE1_Loomorder_epi,"TSNE1_Loomorder_epi.csv",ncolumns=1,sep=",")
head(TSNE1_Loomorder_epi)
TSNE2_Loomorder_epi<-E16_Dec7v3_epi@dr$tsne@cell.embeddings[match(E16_Dec_cv3_name,rownames(E16_Dec7v3_epi@dr$tsne@cell.embeddings)),2]
write(TSNE2_Loomorder_epi,"TSNE2_Loomorder_epi.csv",ncolumns=1,sep=",")
markers for each ciliated population:
E16_Dec_epi_res12_8over1011<-FindMarkers(E16_Dec7v3_epi,ident.1=c(8),ident.2 = c(10,11),only.pos = TRUE)
E16_Dec_epi_res12_8over1011
write.table(E16_Dec_epi_res12_8over1011,"epiSubset_c8inCilia.txt",sep="\t")
E16_Dec_epi_res12_10over811<-FindMarkers(E16_Dec7v3_epi,ident.1=c(10),ident.2 = c(8,11),only.pos = TRUE)
E16_Dec_epi_res12_10over811
E16_Dec_epi_res12_10over8<-FindMarkers(E16_Dec7v3_epi,ident.1=c(10),ident.2 = c(8),only.pos = TRUE)
E16_Dec_epi_res12_10over8
write.table(E16_Dec_epi_res12_10over8,"epiSubset_c10overC8.txt",sep="\t")
E16_Dec7v3_epi <- SetAllIdent(object = E16_Dec7v3_epi, id = "res.1.2")

E16_Dec_epi_res12_10over11<-FindMarkers(E16_Dec7v3_epi,ident.1=c(10),ident.2 = c(11),only.pos = TRUE)
E16_Dec_epi_res12_10over11
write.table(E16_Dec_epi_res12_10over11,"epiSubset_c10overC11.txt",sep="\t")
E16_Dec_epi_res12_11over810<-FindMarkers(E16_Dec7v3_epi,ident.1=c(11),ident.2 = c(8,10),only.pos = TRUE)
E16_Dec_epi_res12_11over810
write.table(E16_Dec_epi_res12_11over810,"epiSubset_c11inCilia.txt",sep="\t")
E16_Dec7v3_epi <- SetAllIdent(object = E16_Dec7v3_epi, id = "res.1.2")
DoHeatmap(object = E16_Dec7v3_epi, genes.use = c("Foxj1","Top2a","Mcidas","Ccno","Foxn4","Shisa8","Lrrc23","Prr18","Cfap53","Cdhr3","Sntn","Ifitm1","Lbp","Ly6c1","Ly6a"), 
    slim.col.label = TRUE, group.label.rot = TRUE,use.scaled = F,cells.use = E16_Dec7v3_epi@cell.names[E16_Dec7v3_epi@meta.data$res.1.2 %in% c(8,10,11)],group.order = c(8,10,11),group.cex = 30,cex.row = 20
  )

scoring:
E16_Dec7v3_epi@data[1:6,1:6]
percentile_table_epi<-apply(E16_Dec7v3_epi@data,1,percent_rank)
percentile_table_epi[1:6,1:6]
OMIMgene<-read.csv(file = "genesOMIM.csv",header=T,sep=",",stringsAsFactors = F)
OMIMgene<-lapply(OMIMgene,function(x) unlist(strsplit(unlist(x),split=","))) 
head(OMIMgene$Mucociliary)
OMIMgene_mucosaGoblet<-as.vector(read.csv(file = "genesOMIM_mucosa_goblet.csv",header=T,sep=",",stringsAsFactors = F)[,1])
OMIMgene_mucosaGoblet<-unlist(strsplit(unlist(OMIMgene_mucosaGoblet),split=","))
OMIMgene_mucosaGoblet[90:105]
 mocosaGoblet_score<- apply(percentile_table_epi[,colnames(percentile_table_epi) %in% OMIMgene_mucosaGoblet],1,mean)
 head( mocosaGoblet_score)
E16_Dec7v3_epi<-AddMetaData(object = E16_Dec7v3_epi, metadata = mocosaGoblet_score, col.name = "mocosaGoblet_score")
VlnPlot(object = E16_Dec7v3_epi, features.plot = c("mocosaGoblet_score"), nCol = 1,x.lab.rot = T,point.size.use = 0.3,use.raw=F,group.by="res.1.4")
 ciliopathy_table<- percentile_table_epi[,colnames(percentile_table_epi) %in% OMIMgene$Ciliopathy]
 ciliopathy_score<- apply(ciliopathy_table,1,mean)
 head(ciliopathy_score)
 PCD_score<- apply(percentile_table_epi[,colnames(percentile_table_epi) %in% OMIMgene$Primary.ciliary.dyskinesia],1,mean)
 head(PCD_score)
E16_Dec7v3_epi<-AddMetaData(object = E16_Dec7v3_epi, metadata = ciliopathy_score, col.name = "ciliopathy_score")
E16_Dec7v3_epi<-AddMetaData(object = E16_Dec7v3_epi, metadata = PCD_score, col.name = "PCD_score")
VlnPlot(object = E16_Dec7v3_epi, features.plot = c("ciliopathy_score"), nCol = 1,x.lab.rot = T,point.size.use = 0.3,use.raw=F,group.by="res.1.2")
VlnPlot(object = E16_Dec7v3_epi, features.plot = c("PCD_score"), nCol = 1,x.lab.rot = T,point.size.use = 0.3,use.raw=F,group.by="res.1.2")
VlnPlot(object = E16_Dec7v3_epi, features.plot = c("PCD_score"), nCol = 1,ident.include = c(8,10,11),x.lab.rot = T,point.size.use = 0.3,use.raw=F,group.by="res.1.2")
E16_Dec7v3_epi <- SetAllIdent(object = E16_Dec7v3_epi, id = "res.1.2")

VlnPlot(object = E16_Dec7v3_epi, features.plot = c("ciliopathy_score"), ident.include = c(11),nCol = 1,x.lab.rot = T,point.size.use = 0.3,use.raw=F,group.by="seq_group")
E16_Dec7v3_epi <- SetAllIdent(object = E16_Dec7v3_epi, id = "res.1.2")

VlnPlot(object = E16_Dec7v3_epi, features.plot = c("PCD_score"), ident.include = c(8),nCol = 1,x.lab.rot = T,point.size.use = 0.3,use.raw=F,group.by="seq_group")
 mucus_score<- apply(percentile_table_epi[,colnames(percentile_table_epi) %in% c(OMIMgene$Airway...Mucus,OMIMgene$Pulmonary.and.Mucus)],1,mean)
 head(mucus_score)
E16_Dec7v3_epi<-AddMetaData(object = E16_Dec7v3_epi, metadata = mucus_score, col.name = "mucus_score")
VlnPlot(object = E16_Dec7v3_epi, features.plot = c("mucus_score"), nCol = 1,x.lab.rot = T,point.size.use = 0.3,use.raw=F,group.by="res.1.4")
 COPD_score<- apply(percentile_table_epi[,colnames(percentile_table_epi) %in% c(OMIMgene$COPD)],1,mean)
 head(COPD_score)
E16_Dec7v3_epi<-AddMetaData(object = E16_Dec7v3_epi, metadata = COPD_score, col.name = "COPD_score")
VlnPlot(object = E16_Dec7v3_epi, features.plot = c("COPD_score"), nCol = 1,x.lab.rot = T,point.size.use = 0.3,use.raw=F,group.by="res.1.4")
 asthma_score<- apply(percentile_table_epi[,colnames(percentile_table_epi) %in% c(OMIMgene$Pulmonary...Asthma)],1,mean)
 head(asthma_score)
E16_Dec7v3_epi<-AddMetaData(object = E16_Dec7v3_epi, metadata = asthma_score, col.name = "asthma_score")
VlnPlot(object = E16_Dec7v3_epi, features.plot = c("asthma_score"), nCol = 1,x.lab.rot = T,point.size.use = 0.3,use.raw=F,group.by="res.1.4")
ggplot(E16_Dec7v3_epi@meta.data,aes(genotype,asthma_score))+facet_grid(.~res.1.2)+geom_dotplot(binaxis="y",aes(color=genotype,fill=genotype),binwidth=0.05,stackdir="center",position=position_dodge(0.8), dotsize=0.2)+stat_compare_means(comparisons = list(c("wt", "mut")),method="wilcox.test",size=4,label="p.adj")+ stat_summary(aes(color=genotype),fun.data=mean_sdl, fun.args = list(mult=1), 
                 geom="pointrange",position=position_dodge(0.7))+ theme(axis.text.x = element_text(angle = 45,hjust=1))
res.used <- 1.4
E16_Dec7v3_epi <- FindClusters(object = E16_Dec7v3_epi, reduction.type = "pca", dims.use = 1:n.pcs.sub, 
                     resolution = res.used, print.output = 0, force.recalc = T)
E16_Dec7v3_epi <- RunTSNE(object = E16_Dec7v3_epi, dims.use = 1:n.pcs.sub, perplexity=30)

E16_Dec7v3_epi=buildClusterTree(E16_Dec7v3_epi,do.reorder = F,reorder.numeric = F,pcs.use = 1:17)
table(E16_Dec7v3_epi@meta.data$res.1.4,E16_Dec7v3_epi@meta.data$seq_group)
prop.table(table(E16_Dec7v3_epi@meta.data$res.1.4,E16_Dec7v3_epi@meta.data$seq_group),2)
    
     E16_Dec7_mut_7 E16_Dec7_mut_8 E16_Dec7_wt_1 E16_Dec7_wt_6
  0     0.032475749    0.059523810   0.242384964   0.153679654
  1     0.113454239    0.068948413   0.099157485   0.145743146
  10    0.021931674    0.095238095   0.032404407   0.014430014
  11    0.050611556    0.028273810   0.036292936   0.048340548
  12    0.043441586    0.033730159   0.036292936   0.041125541
  13    0.032053986    0.026289683   0.043421905   0.028860029
  14    0.024040489    0.039682540   0.014906027   0.038239538
  15    0.051455082    0.022321429   0.005832793   0.014430014
  16    0.009700548    0.041666667   0.011665587   0.041847042
  17    0.029523408    0.024305556   0.002592353   0.020923521
  18    0.012652889    0.011904762   0.009073234   0.012987013
  2     0.099114298    0.112599206   0.050550875   0.084415584
  3     0.074230283    0.051091270   0.106934543   0.093073593
  4     0.088570224    0.096726190   0.053143227   0.057720058
  5     0.043019823    0.086805556   0.079066753   0.059884560
  6     0.147195276    0.023809524   0.030460143   0.023809524
  7     0.060733868    0.041666667   0.059624109   0.043290043
  8     0.014339941    0.082837302   0.053791316   0.046176046
  9     0.051455082    0.052579365   0.032404407   0.031024531

E16_Dec7v3_epi@meta.data$cell_type<-mapvalues(E16_Dec7v3_epi@meta.data$res.1.4,from=c("0","1","2","3","4","5","6","7","8","9","10","11","12","13","14","15","16","17","18"),to=c("Basal","Basal","Secretory","Basal/Secretory","Secretory","Secretory","Secretory","Ciliated","Secretory","Secretory","Secretory","Ciliated","Secretory","Basal","Doublet","Ciliated","Secretory","Doublet","Doublet"))
c14, 17 and c18 are doublets.

table(E16_Dec7v3_epi@meta.data$cell_type[!(E16_Dec7v3_epi@meta.data$res.1.4 %in% c(14,17,18))],E16_Dec7v3_epi@meta.data$genotype[!(E16_Dec7v3_epi@meta.data$res.1.4 %in% c(14,17,18))])
                 
                   mut   wt
  Basal            734 1049
  Basal/Secretory  279  294
  Ciliated         572  304
  Secretory       2492 1141
DE_E16_secretory_genotype<-FindMarkers(E16_Dec7v3_epi,cells.1<-WhichCells(object=E16_Dec7v3_epi,cells.use = (E16_Dec7v3_epi@meta.data$genotype=="wt" & E16_Dec7v3_epi@meta.data$cell_type=="Secretory" )),cells.2<-WhichCells(object=E16_Dec7v3_epi,cells.use = (E16_Dec7v3_epi@meta.data$genotype=="mut" & E16_Dec7v3_epi@meta.data$cell_type=="Secretory" )),only.pos = F,logfc.threshold=0,min.pct=0)

   |                                                  | 0 % ~calculating  
   |+                                                 | 1 % ~30m 46s      
   |+                                                 | 2 % ~30m 22s      
   |++                                                | 3 % ~30m 21s      
   |++                                                | 4 % ~30m 15s      
   |+++                                               | 5 % ~29m 42s      
   |+++                                               | 6 % ~29m 17s      
   |++++                                              | 7 % ~28m 51s      
   |++++                                              | 8 % ~28m 30s      
   |+++++                                             | 9 % ~28m 06s      
   |+++++                                             | 10% ~27m 47s      
   |++++++                                            | 11% ~27m 28s      
   |++++++                                            | 12% ~27m 08s      
   |+++++++                                           | 13% ~26m 51s      
   |+++++++                                           | 14% ~26m 32s      
   |++++++++                                          | 15% ~26m 14s      
   |++++++++                                          | 16% ~25m 55s      
   |+++++++++                                         | 17% ~25m 37s      
   |+++++++++                                         | 18% ~25m 17s      
   |++++++++++                                        | 19% ~24m 58s      
   |++++++++++                                        | 20% ~24m 43s      
   |+++++++++++                                       | 21% ~24m 25s      
   |+++++++++++                                       | 22% ~24m 07s      
   |++++++++++++                                      | 23% ~23m 51s      
   |++++++++++++                                      | 24% ~23m 31s      
   |+++++++++++++                                     | 25% ~23m 12s      
   |+++++++++++++                                     | 26% ~22m 52s      
   |++++++++++++++                                    | 27% ~22m 34s      
   |++++++++++++++                                    | 28% ~22m 15s      
   |+++++++++++++++                                   | 29% ~21m 55s      
   |+++++++++++++++                                   | 30% ~21m 37s      
   |++++++++++++++++                                  | 31% ~21m 18s      
   |++++++++++++++++                                  | 32% ~20m 59s      
   |+++++++++++++++++                                 | 33% ~20m 40s      
   |+++++++++++++++++                                | 34% ~20m 22s      
   |++++++++++++++++++                                | 35% ~20m 04s      
   |++++++++++++++++++                                | 36% ~19m 46s      
   |+++++++++++++++++++                               | 37% ~19m 28s      
   |+++++++++++++++++++                               | 38% ~19m 10s      
   |++++++++++++++++++++                              | 39% ~18m 51s      
   |++++++++++++++++++++                              | 40% ~18m 33s      
   |+++++++++++++++++++++                             | 41% ~18m 15s      
   |+++++++++++++++++++++                             | 42% ~17m 57s      
   |++++++++++++++++++++++                            | 43% ~17m 38s      
   |++++++++++++++++++++++                            | 44% ~17m 19s      
   |+++++++++++++++++++++++                           | 45% ~17m 01s      
   |+++++++++++++++++++++++                           | 46% ~16m 42s      
   |++++++++++++++++++++++++                          | 47% ~16m 24s      
   |++++++++++++++++++++++++                          | 48% ~16m 05s      
   |+++++++++++++++++++++++++                         | 49% ~15m 46s      
   |+++++++++++++++++++++++++                         | 50% ~15m 27s      
   |++++++++++++++++++++++++++                        | 51% ~15m 08s      
   |++++++++++++++++++++++++++                        | 52% ~14m 50s      
   |+++++++++++++++++++++++++++                       | 53% ~14m 31s      
   |+++++++++++++++++++++++++++                       | 54% ~14m 13s      
   |++++++++++++++++++++++++++++                      | 55% ~13m 54s      
   |++++++++++++++++++++++++++++                     | 56% ~13m 35s      
   |+++++++++++++++++++++++++++++                     | 57% ~13m 17s      
   |+++++++++++++++++++++++++++++                     | 58% ~12m 58s      
   |++++++++++++++++++++++++++++++                    | 59% ~12m 40s      
   |++++++++++++++++++++++++++++++                    | 60% ~12m 22s      
   |+++++++++++++++++++++++++++++++                   | 61% ~12m 03s      
   |+++++++++++++++++++++++++++++++                   | 62% ~11m 45s      
   |++++++++++++++++++++++++++++++++                  | 63% ~11m 26s      
   |++++++++++++++++++++++++++++++++                  | 64% ~11m 08s      
   |+++++++++++++++++++++++++++++++++                 | 65% ~10m 49s      
   |+++++++++++++++++++++++++++++++++                 | 66% ~10m 31s      
   |++++++++++++++++++++++++++++++++++                | 67% ~10m 12s      
   |++++++++++++++++++++++++++++++++++               | 68% ~09m 53s      
   |+++++++++++++++++++++++++++++++++++               | 69% ~09m 35s      
   |+++++++++++++++++++++++++++++++++++               | 70% ~09m 16s      
   |++++++++++++++++++++++++++++++++++++              | 71% ~08m 58s      
   |++++++++++++++++++++++++++++++++++++              | 72% ~08m 39s      
   |+++++++++++++++++++++++++++++++++++++             | 73% ~08m 20s      
   |+++++++++++++++++++++++++++++++++++++             | 74% ~08m 02s      
   |++++++++++++++++++++++++++++++++++++++            | 75% ~07m 43s      
   |++++++++++++++++++++++++++++++++++++++            | 76% ~07m 25s      
   |+++++++++++++++++++++++++++++++++++++++           | 77% ~07m 06s      
   |+++++++++++++++++++++++++++++++++++++++          | 78% ~06m 48s      
   |++++++++++++++++++++++++++++++++++++++++          | 79% ~06m 29s      
   |++++++++++++++++++++++++++++++++++++++++         | 80% ~06m 11s      
   |+++++++++++++++++++++++++++++++++++++++++         | 81% ~05m 53s      
   |+++++++++++++++++++++++++++++++++++++++++         | 82% ~05m 34s      
   |++++++++++++++++++++++++++++++++++++++++++        | 83% ~05m 15s      
   |++++++++++++++++++++++++++++++++++++++++++        | 84% ~04m 57s      
   |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~04m 38s      
   |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~04m 20s      
   |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~04m 01s      
   |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~03m 42s      
   |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~03m 24s      
   |+++++++++++++++++++++++++++++++++++++++++++++    | 90% ~03m 05s      
   |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~02m 47s      
   |++++++++++++++++++++++++++++++++++++++++++++++   | 92% ~02m 28s      
   |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~02m 10s      
   |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~01m 51s      
   |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~01m 33s      
   |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~01m 14s      
   |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~56s          
   |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~37s          
   |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~19s          
   |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed = 30m 50s
DE_E16_secretory_genotype
library(ggrepel)
DE_E16_secretory_genotype$gene<-rownames(DE_E16_secretory_genotype)
DE_E16_secretory_genotype$sig<-DE_E16_secretory_genotype$p_val_adj<0.001
volc = ggplot(DE_E16_secretory_genotype, aes(avg_logFC, -log10(p_val_adj))) + #volcanoplot with avg_logFC versus p_val_adj
    geom_point(aes(col=sig)) + #add points colored by significance
    scale_color_manual(values=c("black", "red")) + 
    ggtitle("E16secretory_wt/mut") + geom_text_repel(data=head(DE_E16_secretory_genotype, 20), aes(label=gene), point.padding = 1, box.padding = .3) +
  labs(y = expression(-log[10]*" "*"adjusted pvalue"), x = "avg log fold change") + 
  theme(legend.title = element_blank(), legend.position = "top") + 
  scale_fill_discrete(labels = c("Not Sig", "adjusted pval < 0.001"))
volc

E16_Dec7v3_epi@meta.data$specific_type<-mapvalues(E16_Dec7v3_epi@meta.data$res.1.4,from=c("0","1","2","3","4","5","6","7","8","9","10","11","12","13","14","15","16","17","18"),to=c("Basal-Krt14","Basal","Secretory-Krt4","Basal/Secretory","Secretory-Krt4","Secretory","Secretory-Krt4","Ciliated","Secretory","Secretory-Krt4","Secretory-Krt4","Ciliated","CyclingSecretory","CyclingBasal","Doublet","Ciliated","Secretory","Doublet","Doublet"))
table(E16_Dec7v3_epi@meta.data$specific_type[!(E16_Dec7v3_epi@meta.data$res.1.4 %in% c(14,17,18))],E16_Dec7v3_epi@meta.data$genotype[!(E16_Dec7v3_epi@meta.data$res.1.4 %in% c(14,17,18))])
                  
                    mut   wt
  Basal             408  355
  Basal/Secretory   279  294
  Basal-Sostdc1     197  587
  Ciliated          572  304
  CyclingBasal      129  107
  CyclingSecretory  171  113
  Secretory         585  428
  Secretory-Krt4   1736  600

markers for specific clusters:

E16_Dec7v3_epi<-SetAllIdent(object = E16_Dec7v3_epi, id = "specific_type")
E16_Dec7v3_epi@ident=factor(E16_Dec7v3_epi@ident,levels(E16_Dec7v3_epi@ident)[c(4,8,9,2,1,3,6,5,7)])
DotPlot(object = E16_Dec7v3_epi, cols.use = c("forestgreen","magenta3"),genes.plot = c("Foxj1","Ptgdr","B3gnt6","Galnt6","Cgref1","Gp2","Tff2","Muc5b","Muc16","Cited1","Krt4","Creb3l1","Spdef","Clic3","Ccl20","Sostdc1","Smoc2","Krt14","Bmp7","Trp63","Krt5","Mki67","Top2a"),group.by = "ident", x.lab.rot = T,plot.legend = T,col.max = 2,col.min = -2)

print(levels(E16_Dec7v3_epi@ident))
[1] "Basal"            "Basal/Secretory"  "Basal-Sostdc1"    "Ciliated"         "CyclingBasal"     "CyclingSecretory" "Doublet"          "Secretory"       
[9] "Secretory-Krt4"  

save(E16_Dec7v3_epi,file="E16_Dec7v3_epi.RData")

different populations of basal cells:

write.table(E16_Dec_epi_res14_0over1,"epiSubset_res14_c0overC1.txt",sep="\t")
library(ggrepel)
E16_Dec_epi_res14_0over1$gene<-rownames(E16_Dec_epi_res14_0over1)
E16_Dec_epi_res14_0over1$sig<-E16_Dec_epi_res14_0over1$p_val_adj<0.001
volc = ggplot(E16_Dec_epi_res14_0over1, aes(avg_logFC, -log10(p_val_adj))) + #volcanoplot with avg_logFC versus p_val_adj
    geom_point(aes(col=sig)) + #add points colored by significance
    scale_color_manual(values=c("black", "red")) + 
    ggtitle("E16_epi_0over1") 

E16_Dec_epi_res14_0over1_volc.1 <- volc + geom_text_repel(data=head(E16_Dec_epi_res14_0over1, 20), aes(label=gene), point.padding = 1, box.padding = .3) +
  labs(y = expression(-log[10]*" "*"adjusted pvalue"), x = "avg log fold change") + 
  theme(legend.title = element_blank(), legend.position = "top") + 
  scale_fill_discrete(labels = c("Not Sig", "adjusted pval < 0.001"))

E16_Dec7v3_epi <- SetAllIdent(object = E16_Dec7v3_epi, id = "res.1.4")
E16_Dec_epi_res14_1over0<-FindMarkers(E16_Dec7v3_epi,ident.1=c(1),ident.2 = c(0),only.pos = TRUE)

   |                                                  | 0 % ~calculating  
   |+                                                 | 1 % ~05s          
   |++                                                | 3 % ~05s          
   |++                                                | 4 % ~04s          
   |+++                                               | 5 % ~03s          
   |++++                                              | 6 % ~03s          
   |++++                                              | 8 % ~03s          
   |+++++                                             | 9 % ~03s          
   |++++++                                            | 10% ~03s          
   |++++++                                            | 11% ~02s          
   |+++++++                                           | 13% ~02s          
   |+++++++                                           | 14% ~02s          
   |++++++++                                          | 15% ~02s          
   |+++++++++                                         | 16% ~02s          
   |+++++++++                                         | 18% ~02s          
   |++++++++++                                        | 19% ~02s          
   |+++++++++++                                       | 20% ~02s          
   |+++++++++++                                       | 22% ~02s          
   |++++++++++++                                      | 23% ~02s          
   |+++++++++++++                                     | 24% ~02s          
   |+++++++++++++                                     | 25% ~02s          
   |++++++++++++++                                    | 27% ~02s          
   |++++++++++++++                                    | 28% ~02s          
   |+++++++++++++++                                   | 29% ~02s          
   |++++++++++++++++                                  | 30% ~02s          
   |++++++++++++++++                                  | 32% ~02s          
   |+++++++++++++++++                                 | 33% ~02s          
   |++++++++++++++++++                                | 34% ~02s          
   |++++++++++++++++++                                | 35% ~02s          
   |+++++++++++++++++++                               | 37% ~01s          
   |+++++++++++++++++++                               | 38% ~01s          
   |++++++++++++++++++++                              | 39% ~01s          
   |+++++++++++++++++++++                             | 41% ~01s          
   |+++++++++++++++++++++                             | 42% ~01s          
   |++++++++++++++++++++++                            | 43% ~01s          
   |+++++++++++++++++++++++                           | 44% ~01s          
   |+++++++++++++++++++++++                           | 46% ~01s          
   |++++++++++++++++++++++++                          | 47% ~01s          
   |+++++++++++++++++++++++++                         | 48% ~01s          
   |+++++++++++++++++++++++++                         | 49% ~01s          
   |++++++++++++++++++++++++++                        | 51% ~01s          
   |++++++++++++++++++++++++++                        | 52% ~01s          
   |+++++++++++++++++++++++++++                       | 53% ~01s          
   |++++++++++++++++++++++++++++                      | 54% ~01s          
   |++++++++++++++++++++++++++++                      | 56% ~01s          
   |+++++++++++++++++++++++++++++                     | 57% ~01s          
   |++++++++++++++++++++++++++++++                    | 58% ~01s          
   |++++++++++++++++++++++++++++++                    | 59% ~01s          
   |+++++++++++++++++++++++++++++++                   | 61% ~01s          
   |++++++++++++++++++++++++++++++++                  | 62% ~01s          
   |++++++++++++++++++++++++++++++++                  | 63% ~01s          
   |+++++++++++++++++++++++++++++++++                 | 65% ~01s          
   |+++++++++++++++++++++++++++++++++                 | 66% ~01s          
   |++++++++++++++++++++++++++++++++++                | 67% ~01s          
   |+++++++++++++++++++++++++++++++++++               | 68% ~01s          
   |+++++++++++++++++++++++++++++++++++               | 70% ~01s          
   |++++++++++++++++++++++++++++++++++++              | 71% ~01s          
   |+++++++++++++++++++++++++++++++++++++             | 72% ~01s          
   |+++++++++++++++++++++++++++++++++++++             | 73% ~01s          
   |++++++++++++++++++++++++++++++++++++++            | 75% ~01s          
   |++++++++++++++++++++++++++++++++++++++            | 76% ~01s          
   |+++++++++++++++++++++++++++++++++++++++           | 77% ~01s          
   |++++++++++++++++++++++++++++++++++++++++          | 78% ~01s          
   |++++++++++++++++++++++++++++++++++++++++          | 80% ~00s          
   |+++++++++++++++++++++++++++++++++++++++++         | 81% ~00s          
   |++++++++++++++++++++++++++++++++++++++++++        | 82% ~00s          
   |++++++++++++++++++++++++++++++++++++++++++        | 84% ~00s          
   |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~00s          
   |++++++++++++++++++++++++++++++++++++++++++++      | 86% ~00s          
   |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~00s          
   |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~00s          
   |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~00s          
   |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~00s          
   |+++++++++++++++++++++++++++++++++++++++++++++++   | 92% ~00s          
   |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~00s          
   |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~00s          
   |+++++++++++++++++++++++++++++++++++++++++++++++++ | 96% ~00s          
   |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~00s          
   |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
   |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed = 02s
E16_Dec_epi_res14_1over0
write.table(E16_Dec_epi_res14_1over0,"epiSubset_res14_c1overC0.txt",sep="\t")
E16_Dec7v3_epi <- SetAllIdent(object = E16_Dec7v3_epi, id = "res.1.4")
E16_Dec_epi_res14_9over1<-FindMarkers(E16_Dec7v3_epi,ident.1=c(9),ident.2 = c(1),only.pos = TRUE)
E16_Dec_epi_res14_9over1
write.table(E16_Dec_epi_res14_9over1,"epiSubset_res14_c9overC1.txt",sep="\t")
E16_Dec7v3_epi <- SetAllIdent(object = E16_Dec7v3_epi, id = "res.1.4")
E16_Dec_epi_res14_1over9<-FindMarkers(E16_Dec7v3_epi,ident.1=c(1),ident.2 = c(9),only.pos = TRUE)
E16_Dec_epi_res14_1over9
write.table(E16_Dec_epi_res14_1over9,"epiSubset_res14_c1overC9.txt",sep="\t")

different populations of ciliated cells:

different populations of secretory cells:

Sostdc1 seems to be downregulated in mutant basal-Sostdc1 population.
epi_marker_c0_mut_wt<-FindMarkers(E16_Dec7v3_epi,cells.1<-WhichCells(object=E16_Dec7v3_epi,ident=0,cells.use = E16_Dec7v3_epi@meta.data$genotype=="mut"),cells.2<-WhichCells(object=E16_Dec7v3_epi,ident=0,cells.use = E16_Dec7v3_epi@meta.data$genotype=="wt"),only.pos = TRUE)
epi_marker_c0_mut_wt
E16_Dec7v3_epi@meta.data$type_genotype<-as.factor(paste(E16_Dec7v3_epi@meta.data$cell_type,E16_Dec7v3_epi@meta.data$genotype,sep="_"))

E16_Dec7v3_epi<-SetAllIdent(object = E16_Dec7v3_epi, id = "type_genotype")
E16_Dec7v3_epi@ident=factor(E16_Dec7v3_epi@ident,levels(E16_Dec7v3_epi@ident)[c(1,4,2,3,9,10,5,6,7,8)])
DotPlot(object = E16_Dec7v3_epi, cols.use = c("forestgreen","magenta3"),genes.plot = rev(c("Nfkbia","Nfkbiz","Retnla","Cxcl17","Cxcl15","Ccl20","Areg","Muc5b","Muc4","Pigr","Ltf","Lyz2","Slpi","Lcn2","Sftpd","Sftpb","Defb1","Lgals3","Itln1")),x.lab.rot = T,plot.legend = T,group.by = "ident",do.return=T,col.min = -2,col.max = 2)+rotate()+ theme(axis.text.x = element_text(angle = 45, vjust = 1,hjust=1)) 

DE_E16_ciliated_genotype<-FindMarkers(E16_Dec7v3_epi,cells.1<-WhichCells(object=E16_Dec7v3_epi,cells.use = (E16_Dec7v3_epi@meta.data$genotype=="wt" & E16_Dec7v3_epi@meta.data$cell_type=="Ciliated" )),cells.2<-WhichCells(object=E16_Dec7v3_epi,cells.use = (E16_Dec7v3_epi@meta.data$genotype=="mut" & E16_Dec7v3_epi@meta.data$cell_type=="Ciliated" )),only.pos = F,logfc.threshold=0,min.pct=0.05)

   |                                                  | 0 % ~calculating  
   |+                                                 | 1 % ~05m 51s      
   |+                                                 | 2 % ~05m 39s      
   |++                                                | 3 % ~05m 36s      
   |++                                                | 4 % ~05m 29s      
   |+++                                               | 5 % ~05m 29s      
   |+++                                               | 6 % ~05m 23s      
   |++++                                              | 7 % ~05m 20s      
   |++++                                              | 8 % ~05m 15s      
   |+++++                                             | 9 % ~05m 14s      
   |+++++                                             | 10% ~05m 09s      
   |++++++                                            | 11% ~05m 05s      
   |++++++                                            | 12% ~05m 04s      
   |+++++++                                           | 13% ~05m 02s      
   |+++++++                                           | 14% ~04m 57s      
   |++++++++                                          | 15% ~04m 54s      
   |++++++++                                          | 16% ~04m 50s      
   |+++++++++                                         | 17% ~04m 47s      
   |+++++++++                                         | 18% ~04m 42s      
   |++++++++++                                        | 19% ~04m 39s      
   |++++++++++                                        | 20% ~04m 35s      
   |+++++++++++                                       | 21% ~04m 32s      
   |+++++++++++                                       | 22% ~04m 28s      
   |++++++++++++                                      | 23% ~04m 25s      
   |++++++++++++                                      | 24% ~04m 21s      
   |+++++++++++++                                     | 25% ~04m 18s      
   |+++++++++++++                                     | 26% ~04m 14s      
   |++++++++++++++                                    | 27% ~04m 11s      
   |++++++++++++++                                    | 28% ~04m 08s      
   |+++++++++++++++                                   | 29% ~04m 05s      
   |+++++++++++++++                                   | 30% ~04m 01s      
   |++++++++++++++++                                  | 31% ~03m 58s      
   |++++++++++++++++                                  | 32% ~03m 55s      
   |+++++++++++++++++                                 | 33% ~03m 51s      
   |+++++++++++++++++                                | 34% ~03m 47s      
   |++++++++++++++++++                                | 35% ~03m 44s      
   |++++++++++++++++++                                | 36% ~03m 40s      
   |+++++++++++++++++++                               | 37% ~03m 37s      
   |+++++++++++++++++++                               | 38% ~03m 34s      
   |++++++++++++++++++++                              | 39% ~03m 30s      
   |++++++++++++++++++++                              | 40% ~03m 27s      
   |+++++++++++++++++++++                             | 41% ~03m 24s      
   |+++++++++++++++++++++                             | 42% ~03m 20s      
   |++++++++++++++++++++++                            | 43% ~03m 18s      
   |++++++++++++++++++++++                            | 44% ~03m 14s      
   |+++++++++++++++++++++++                           | 45% ~03m 10s      
   |+++++++++++++++++++++++                           | 46% ~03m 07s      
   |++++++++++++++++++++++++                          | 47% ~03m 03s      
   |++++++++++++++++++++++++                          | 48% ~02m 59s      
   |+++++++++++++++++++++++++                         | 49% ~02m 56s      
   |+++++++++++++++++++++++++                         | 50% ~02m 52s      
   |++++++++++++++++++++++++++                        | 51% ~02m 49s      
   |++++++++++++++++++++++++++                        | 52% ~02m 45s      
   |+++++++++++++++++++++++++++                       | 53% ~02m 41s      
   |+++++++++++++++++++++++++++                       | 54% ~02m 38s      
   |++++++++++++++++++++++++++++                      | 55% ~02m 35s      
   |++++++++++++++++++++++++++++                     | 56% ~02m 31s      
   |+++++++++++++++++++++++++++++                     | 57% ~02m 28s      
   |+++++++++++++++++++++++++++++                     | 58% ~02m 24s      
   |++++++++++++++++++++++++++++++                    | 59% ~02m 21s      
   |++++++++++++++++++++++++++++++                    | 60% ~02m 17s      
   |+++++++++++++++++++++++++++++++                   | 61% ~02m 14s      
   |+++++++++++++++++++++++++++++++                   | 62% ~02m 10s      
   |++++++++++++++++++++++++++++++++                  | 63% ~02m 07s      
   |++++++++++++++++++++++++++++++++                  | 64% ~02m 03s      
   |+++++++++++++++++++++++++++++++++                 | 65% ~01m 60s      
   |+++++++++++++++++++++++++++++++++                 | 66% ~01m 56s      
   |++++++++++++++++++++++++++++++++++                | 67% ~01m 53s      
   |++++++++++++++++++++++++++++++++++               | 68% ~01m 49s      
   |+++++++++++++++++++++++++++++++++++               | 69% ~01m 46s      
   |+++++++++++++++++++++++++++++++++++               | 70% ~01m 42s      
   |++++++++++++++++++++++++++++++++++++              | 71% ~01m 39s      
   |++++++++++++++++++++++++++++++++++++              | 72% ~01m 35s      
   |+++++++++++++++++++++++++++++++++++++             | 73% ~01m 32s      
   |+++++++++++++++++++++++++++++++++++++             | 74% ~01m 29s      
   |++++++++++++++++++++++++++++++++++++++            | 75% ~01m 25s      
   |++++++++++++++++++++++++++++++++++++++            | 76% ~01m 22s      
   |+++++++++++++++++++++++++++++++++++++++           | 77% ~01m 18s      
   |+++++++++++++++++++++++++++++++++++++++          | 78% ~01m 15s      
   |++++++++++++++++++++++++++++++++++++++++          | 79% ~01m 12s      
   |++++++++++++++++++++++++++++++++++++++++         | 80% ~01m 08s      
   |+++++++++++++++++++++++++++++++++++++++++         | 81% ~01m 05s      
   |+++++++++++++++++++++++++++++++++++++++++         | 82% ~01m 01s      
   |++++++++++++++++++++++++++++++++++++++++++        | 83% ~58s          
   |++++++++++++++++++++++++++++++++++++++++++        | 84% ~54s          
   |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~51s          
   |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~48s          
   |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~44s          
   |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~41s          
   |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~37s          
   |+++++++++++++++++++++++++++++++++++++++++++++    | 90% ~34s          
   |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~31s          
   |++++++++++++++++++++++++++++++++++++++++++++++   | 92% ~27s          
   |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~24s          
   |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~20s          
   |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~17s          
   |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~14s          
   |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~10s          
   |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~07s          
   |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~03s          
   |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed = 05m 40s
DE_E16_ciliated_genotype
write.table(DE_E16_ciliated_genotype,"DE_E16_ciliated_genotype.txt",sep="\t")
DE_E16_ciliated_genotype$gene<-rownames(DE_E16_ciliated_genotype)
E16_ciliated_automatic_geneList<-DE_E16_ciliated_genotype$gene[DE_E16_ciliated_genotype$p_val_adj<0.001 & abs(DE_E16_ciliated_genotype$avg_logFC)>0.5 & abs(DE_E16_ciliated_genotype$pct.1-DE_E16_ciliated_genotype$pct.2)>0.15]
library(ggrepel)
#DE_P4_secretory_genotype$sig<-DE_P4_secretory_genotype$p_val_adj<0.001
DE_E16_ciliated_genotype$threshold<- ifelse(DE_E16_ciliated_genotype$avg_logFC>0 & DE_E16_ciliated_genotype$p_val_adj<0.001, "wt_enrich",ifelse(DE_E16_ciliated_genotype$avg_logFC<0 & DE_E16_ciliated_genotype$p_val_adj<0.001, "mut_enrich","NotSignificant" ) )
ggplot(DE_E16_ciliated_genotype, aes(avg_logFC, -log10(p_val_adj))) + #volcanoplot with avg_logFC versus p_val_adj
    geom_point(aes(col=threshold),size=0.2) + #add points colored by significance
  scale_color_manual(values=c("green", "black","magenta"))+
    ggtitle("E16Ciliated_wt/mut") + geom_text_repel(data=DE_E16_ciliated_genotype[DE_E16_ciliated_genotype$gene %in% E16_ciliated_automatic_geneList,], aes(label=gene), point.padding = 1, box.padding = .3) +
  labs(y = expression(-log[10]*" "*"adjusted pvalue"), x = "avg log fold change") + 
  theme(legend.title = element_blank(), legend.position = "top") 

PCD genes are not significantly differentially expressed between genotypes:
#DE_P4_secretory_genotype$sig<-DE_P4_secretory_genotype$p_val_adj<0.001
DE_E16_ciliated_genotype$threshold<- ifelse(DE_E16_ciliated_genotype$avg_logFC>0 & DE_E16_ciliated_genotype$p_val_adj<0.001, "wt_enrich",ifelse(DE_E16_ciliated_genotype$avg_logFC<0 & DE_E16_ciliated_genotype$p_val_adj<0.001, "mut_enrich","NotSignificant" ) )
ggplot(DE_E16_ciliated_genotype, aes(avg_logFC, -log10(p_val_adj))) + #volcanoplot with avg_logFC versus p_val_adj
    geom_point(aes(col=threshold),size=0.2) + #add points colored by significance
  scale_color_manual(values=c("green", "black","magenta"))+
    ggtitle("E16Ciliated_wt/mut") + geom_text_repel(data=DE_E16_ciliated_genotype[DE_E16_ciliated_genotype$gene %in% geneList$Primary.ciliary.dyskinesia,], aes(label=gene), point.padding = 1, box.padding = .3) +
  labs(y = expression(-log[10]*" "*"adjusted pvalue"), x = "avg log fold change") + 
  theme(legend.title = element_blank(), legend.position = "top") 

df_E16_epi<-FetchData(E16_Dec7v3_epi,c("Spdef","Creb3l1","Scgb3a2","Scgb1a1","Krt4","Krt13","Foxa3","Aqp3","Aqp4","Aqp5","Gp2","Sostdc1","Smoc2","Krt14","Krt15","Krt5","Rac2","Clic3","res.1.2","res.1.4","genotype","seq_group","specific_type","cell_type","Defb1","Lyz2","Ltf","Sftpa1","Sftpd","Sftpb","Slpi","Lcn2","Pigr","Muc5b","Muc5ac","Chil4","Muc1","Muc2","Muc4","Muc16","Muc20","Lbp","Cd14","Tlr4","Tlr2","Myd88","Ticam1","Itln1","Lgals3","Reg3g","Nod1","Nod2","Ddx58","Ifih1","Dhx58","Ccl5","Cxcl10","Cxcl2","Cxcl1","Pf4","Cxcl12","Cxcl14","Cxcl15","Cxcl16","Cxcl17","Ccl2","Ccl7","Ccl17","Ccl20","Ccl21a","Ccl25","Ccl27a","Ccl28","Cx3cl1","Il10","Tnf","S100a8","S100a9","Il6","Il18","Il1b","Il1rl1","Ccl11","Ccl24","Il33","Il25","Tslp","F2rl1","Retnla","Alox15","Alox5","Gata2","Tgfb2","Tgfb1","Ormdl3","Ptges","Ptgds","Ptgs2","Hpgds","Tbxas1","Areg"))
Error in FetchData(E16_Dec7v3_epi, c("Spdef", "Creb3l1", "Scgb3a2", "Scgb1a1",  : 
  Error: Chil4 not found
MicrobialSensing:
for (i in c("Lbp","Cd14","Tlr4","Tlr2","Myd88","Ticam1","Itln1","Reg3g","Lgals3","Nod1","Nod2","Ddx58","Ifih1","Dhx58"))
{
pdf(file = paste("Manuscript/MicrobialSensing_genotype/E16/",i,".pdf", sep = ""), width = 6, height = 5)
print(ggplot(df_E16_epi,aes_string(x="genotype",y=i))+facet_grid(.~cell_type)+geom_dotplot(binaxis="y",aes(fill=genotype),binwidth=0.05,stackdir="center",position=position_dodge(0.8), dotsize=0.2)+stat_compare_means(comparisons = list(c("wt", "mut")),method="wilcox.test",size=4,label="p.adj")+ stat_summary(aes(color=genotype),fun.data=mean_sdl, fun.args = list(mult=1), 
                 geom="pointrange",position=position_dodge(0.7))+ theme(axis.text.x = element_text(angle = 45,hjust=1),strip.text.x = element_text(size = 9, colour = "black", angle = 0)))
dev.off()
}
antimicrobial effectors:
for (i in c("Muc1","Muc4","Muc16","Muc20","Muc5b","Muc5ac","Muc2","Defb1","Lyz2","Ltf","Sftpa1","Sftpd","Sftpb","Slpi","Lcn2","Pigr","Chil4"))
{
pdf(file = paste("Manuscript/Effectors_genotype/E16/",i,".pdf", sep = ""), width = 6, height = 5)
print(ggplot(df_E16_epi,aes_string(x="genotype",y=i))+facet_grid(.~cell_type)+geom_dotplot(binaxis="y",aes(fill=genotype),binwidth=0.05,stackdir="center",position=position_dodge(0.8), dotsize=0.2)+stat_compare_means(comparisons = list(c("wt", "mut")),method="wilcox.test",size=4,label="p.adj")+ stat_summary(aes(color=genotype),fun.data=mean_sdl, fun.args = list(mult=1), 
                 geom="pointrange",position=position_dodge(0.7))+ theme(axis.text.x = element_text(angle = 45,hjust=1),strip.text.x = element_text(size = 9, colour = "black", angle = 0)))
dev.off()
}
Error in FUN(X[[i]], ...) : object 'Chil4' not found
chemokines:
for (i in c("Ccl5","Cxcl10","Cxcl2","Cxcl1","Pf4","Cxcl12","Cxcl14","Cxcl15","Cxcl16","Cxcl17","Ccl2","Ccl7","Ccl17","Ccl20","Ccl21a","Ccl25","Ccl27a","Ccl28","Cx3cl1"))
{
pdf(file = paste("Manuscript/chemokines_genotype/E16/",i,".pdf", sep = ""), width = 6, height = 5)
print(ggplot(df_E16_epi,aes_string(x="genotype",y=i))+facet_grid(.~cell_type)+geom_dotplot(binaxis="y",aes(fill=genotype),binwidth=0.05,stackdir="center",position=position_dodge(0.8), dotsize=0.2)+stat_compare_means(comparisons = list(c("wt", "mut")),method="wilcox.test",size=4,label="p.adj")+ stat_summary(aes(color=genotype),fun.data=mean_sdl, fun.args = list(mult=1), 
                 geom="pointrange",position=position_dodge(0.7))+ theme(axis.text.x = element_text(angle = 45,hjust=1),strip.text.x = element_text(size = 9, colour = "black", angle = 0)))
dev.off()
}
Th2:
for (i in c("Il10","Tnf","S100a8","S100a9","Il6","Il18","Il1b","Il1rl1","Ccl11","Ccl24","Il33","Il25","Tslp","F2rl1","Retnla","Alox15","Alox5","Gata2","Tgfb2","Tgfb1","Ormdl3","Ptges","Ptgds","Ptgs2","Hpgds","Tbxas1","Areg"))
{
pdf(file = paste("Manuscript/Th2_genotype/E16/",i,".pdf", sep = ""), width = 6, height = 5)
print(ggplot(df_E16_epi,aes_string(x="genotype",y=i))+facet_grid(.~cell_type)+geom_dotplot(binaxis="y",aes(fill=genotype),binwidth=0.05,stackdir="center",position=position_dodge(0.8), dotsize=0.2)+stat_compare_means(comparisons = list(c("wt", "mut")),method="wilcox.test",size=4,label="p.adj")+ stat_summary(aes(color=genotype),fun.data=mean_sdl, fun.args = list(mult=1), 
                 geom="pointrange",position=position_dodge(0.7))+ theme(axis.text.x = element_text(angle = 45,hjust=1),strip.text.x = element_text(size = 9, colour = "black", angle = 0)))
dev.off()
}

explore genes correlated with basal–>secretory changes:
c3 is the basal/secretory population
E16_Dec7v3_epi <- SetAllIdent(object = E16_Dec7v3_epi, id = "res.1.4")
E16_Dec7v3_epi_subc3<-SubsetData(object=E16_Dec7v3_epi,ident.use=c(3))
table(E16_Dec7v3_epi_subc3@meta.data$res.1.4)
E16_Dec7v3_epi_subc3@meta.data<-E16_Dec7v3_epi_subc3@meta.data[,-which(names(E16_Dec7v3_epi_subc3@meta.data) %in% c("res.0.8", "res.1.2", "res.1.4", "res.1.6"))] #remove old metadata
E16_Dec7v3_epi_subc3 <- ScaleData(object = E16_Dec7v3_epi_subc3)
E16_Dec7v3_epi_subc3 <- FindVariableGenes(object = E16_Dec7v3_epi_subc3, do.plot = TRUE, x.low.cutoff=0.1,x.high.cutoff = Inf, y.cutoff = 0.5)
E16_Dec7v3_epi_subc3 <- RunPCA(object = E16_Dec7v3_epi_subc3, do.print = FALSE)
PCAPlot(E16_Dec7v3_epi_subc3)

PCElbowPlot(object = E16_Dec7v3_epi_subc3)
n.pcs.sub3 = 13
resolution parameter sets the ‘granularity’ of the downstream clustering, with increased values leading to a greater number of clusters.
res.used <- 1.2
E16_Dec7v3_epi_subc3 <- FindClusters(object = E16_Dec7v3_epi_subc3, reduction.type = "pca", dims.use = 1:n.pcs.sub3, 
                     resolution = res.used, print.output = 0, force.recalc = T)
E16_Dec7v3_epi_subc3 <- RunTSNE(object = E16_Dec7v3_epi_subc3, dims.use = 1:n.pcs.sub3, perplexity=30)
TSNEPlot(object = E16_Dec7v3_epi_subc3, do.label = T)
res.used <- 0.8
TSNEPlot(object = E16_Dec7v3_epi_subc3, do.label = T)
res.used <- 0.6
TSNEPlot(object = E16_Dec7v3_epi_subc3, do.label = T)
E16_Dec7v3_epi_subc3 <- SetAllIdent(object = E16_Dec7v3_epi_subc3, id = "res.0.6")
DoHeatmap(object = E16_Dec7v3_epi_subc3, genes.use = c("Epcam","Krt8","Trp63","Krt5","Mki67","Top2a","Smoc2","Ccl20","Sostdc1","Bmp7","Clic3","Cldn10","Tspan33","Ehf","Sfta2","Crip2","Msln","Cyp2s1","Cldn3","Cldn7","Cldn4","AU021092","Tspan1","Chad","Tspan13","Klk10","Klk11","Klk13","Ces1d","Krt4","Krt13","Creb3l1"), 
    slim.col.label = TRUE, group.label.rot = TRUE,use.scaled = T
  )
cor(E16_Dec7v3_epi_subc3@scale.data["Trp63",], E16_Dec7v3_epi_subc3@scale.data["Creb3l1",])
cor(E16_Dec7v3_epi_subc3@data["Trp63",], E16_Dec7v3_epi_subc3@data["Spdef",])
Trp63_cor<-apply(E16_Dec7v3_epi_subc3@scale.data, 1, function(x) cor(E16_Dec7v3_epi_subc3@scale.data["Trp63",],x)) 
head(Trp63_cor) 
min(Trp63_cor,na.rm = T) 
Trp63_cor_order<-order(Trp63_cor,decreasing=T) 
head(Trp63_cor[Trp63_cor_order],20)
sum(is.na(Trp63_cor[Trp63_cor_order]))
Trp63_cor[Trp63_cor_order][15706:15686]
tail(Trp63_cor[Trp63_cor_order],20)
cor.test(E16_Dec7v3_epi_subc3@scale.data["Spdef",], E16_Dec7v3_epi_subc3@scale.data["Trp63",],method="pearson")
cor.test(E16_Dec7v3_epi_subc3@scale.data["Spdef",], E16_Dec7v3_epi_subc3@scale.data["Trp63",],method="kendall")
Trp63_cor_test<-apply(E16_Dec7v3_epi_subc3@scale.data, 1, function(x) cor.test(E16_Dec7v3_epi_subc3@scale.data["Trp63",],x,method="pearson")) 
df_Trp63_corTest<-as.data.frame(do.call(rbind, Trp63_cor_test))
df_order_Trp63_corTest<-df_Trp63_corTest[order(unlist(df_Trp63_corTest$estimate)),]
tidy_Trp63_cor<-cbind(df_order_Trp63_corTest$estimate,df_order_Trp63_corTest$p.value)
colnames(tidy_Trp63_cor)<-c("cor","p.value")
head(tidy_Trp63_cor,20)
tidy_Trp63_cor[15706:15686,]
tail(tidy_Trp63_cor)
Krt8_cor_test<-apply(E16_Dec7v3_epi_subc3@scale.data, 1, function(x) cor.test(E16_Dec7v3_epi_subc3@scale.data["Krt8",],x,method="pearson")) 
df_Krt8_corTest<-as.data.frame(do.call(rbind, Krt8_cor_test))
df_order_Krt8_corTest<-df_Krt8_corTest[order(unlist(df_Krt8_corTest$estimate)),]
sum(is.na(df_order_Krt8_corTest$estimate))
tidy_Krt8_cor<-cbind(df_order_Krt8_corTest$estimate,df_order_Krt8_corTest$p.value)
colnames(tidy_Krt8_cor)<-c("cor","p.value")
head(tidy_Krt8_cor,20)
tidy_Krt8_cor[15666:15706,]
cor.test(E16_Dec7v3_epi_subc3@scale.data["Krt8",E16_Dec7v3_epi_subc3@meta.data$genotype=="wt"], E16_Dec7v3_epi_subc3@scale.data["Numb",E16_Dec7v3_epi_subc3@meta.data$genotype=="wt"],method="pearson")
cor.test(E16_Dec7v3_epi_subc3@scale.data["Krt8",E16_Dec7v3_epi_subc3@meta.data$genotype=="mut"], E16_Dec7v3_epi_subc3@scale.data["Numb",E16_Dec7v3_epi_subc3@meta.data$genotype=="mut"],method="pearson")
LS0tCnRpdGxlOiAiRTE2X0RlY19zdWJzZXQiCm91dHB1dDogaHRtbF9ub3RlYm9vawotLS0KCmBgYHtyfQojbG9hZCgiRTE2X0RlYzd2M19UcmFjaGVhLlJEYXRhIikKYGBgCgojIyMjIyBiYXNhbCwgc2VjcmV0b3J5LCBhbmQgY2lsaWF0ZWQ6CmBgYHtyfQpFMTZfRGVjN3YzX1RyYWNoZWEgPC0gU2V0QWxsSWRlbnQob2JqZWN0ID0gRTE2X0RlYzd2M19UcmFjaGVhLCBpZCA9ICJyZXMuMS4yIikKRTE2X0RlYzd2M19lcGk8LVN1YnNldERhdGEob2JqZWN0PUUxNl9EZWM3djNfVHJhY2hlYSxpZGVudC51c2U9YygxLDIwLDE3LDEzLDE5LDYsOSw0LDcpKQp0YWJsZShFMTZfRGVjN3YzX2VwaUBtZXRhLmRhdGEkcmVzLjEuMikKYGBgCmBgYHtyfQpjb2xuYW1lcyhFMTZfRGVjN3YzX2VwaUBtZXRhLmRhdGEpW2NvbG5hbWVzKEUxNl9EZWM3djNfZXBpQG1ldGEuZGF0YSkgPT0gJ3Jlcy4wLjgnXSA8LSAnb3JpZy4wLjgnCmNvbG5hbWVzKEUxNl9EZWM3djNfZXBpQG1ldGEuZGF0YSlbY29sbmFtZXMoRTE2X0RlYzd2M19lcGlAbWV0YS5kYXRhKSA9PSAncmVzLjEuMiddIDwtICdvcmlnLjEuMicKYGBgCmBgYHtyfQpFMTZfRGVjN3YzX2VwaSA8LSBTY2FsZURhdGEob2JqZWN0ID0gRTE2X0RlYzd2M19lcGkpCmBgYApgYGB7cn0KRTE2X0RlYzd2M19lcGkgPC0gRmluZFZhcmlhYmxlR2VuZXMob2JqZWN0ID0gRTE2X0RlYzd2M19lcGksIGRvLnBsb3QgPSBUUlVFLCB4Lmxvdy5jdXRvZmY9MC4xLHguaGlnaC5jdXRvZmYgPSBJbmYsIHkuY3V0b2ZmID0gMC41KQpgYGAKIyMjIyMjcnVuIFBDQSBvbiB0aGUgc2V0IG9mIGdlbmVzCmBgYHtyfQpFMTZfRGVjN3YzX2VwaSA8LSBSdW5QQ0Eob2JqZWN0ID0gRTE2X0RlYzd2M19lcGksIGRvLnByaW50ID0gRkFMU0UpCiNQQ0FQbG90KEUxNl9EZWM3djNfZXBpKQpgYGAKCmBgYHtyfQpFMTZfRGVjN3YzX2VwaSA8LSBQcm9qZWN0UENBKG9iamVjdCA9IEUxNl9EZWM3djNfZXBpLCBkby5wcmludCA9IEYpCmBgYAoKYGBge3J9ClBDRWxib3dQbG90KG9iamVjdCA9IEUxNl9EZWM3djNfZXBpKQpgYGAKYGBge3IsZmlnLmhlaWdodD01MCxmaWcud2lkdGg9MTV9ClBDSGVhdG1hcChvYmplY3QgPSBFMTZfRGVjN3YzX2VwaSwgcGMudXNlID0gMToyMCwgY2VsbHMudXNlID0gNTAwLCBkby5iYWxhbmNlZCA9IFRSVUUsIGxhYmVsLmNvbHVtbnMgPSBGQUxTRSwgbnVtLmdlbmVzID0gMjUpCgpgYGAKCgpgYGB7cn0Kbi5wY3Muc3ViID0gMTcKYGBgCgpgYGB7cn0KcmVzLnVzZWQgPC0gMS4yCmBgYAoKYGBge3J9CkUxNl9EZWM3djNfZXBpIDwtIEZpbmRDbHVzdGVycyhvYmplY3QgPSBFMTZfRGVjN3YzX2VwaSwgcmVkdWN0aW9uLnR5cGUgPSAicGNhIiwgZGltcy51c2UgPSAxOm4ucGNzLnN1YiwgCiAgICAgICAgICAgICAgICAgICAgIHJlc29sdXRpb24gPSByZXMudXNlZCwgcHJpbnQub3V0cHV0ID0gMCwgZm9yY2UucmVjYWxjID0gVCkKYGBgCmBgYHtyfQpFMTZfRGVjN3YzX2VwaSA8LSBSdW5UU05FKG9iamVjdCA9IEUxNl9EZWM3djNfZXBpLCBkaW1zLnVzZSA9IDE6bi5wY3Muc3ViLCBwZXJwbGV4aXR5PTMwKQpgYGAKYGBge3IsIGZpZy53aWR0aD0xMCxmaWcuaGVpZ2h0PTl9ClRTTkVQbG90KG9iamVjdCA9IEUxNl9EZWM3djNfZXBpLCBkby5sYWJlbCA9IFQscHQuc2l6ZSA9IDAuNCkKYGBgCgojIyMjIyBnZXQgdFNORSBlbWJlZGRpbmcgZm9yIHZlbG9jeXRvOgpgYGB7cn0KRTE2X0RlY19jdjNfSUQ8LXJlYWQuY3N2KGZpbGU9IkUxNl9EZWNfY3YzX0lELmNzdiIsaGVhZGVyPUYsc2VwPSIsIixzdHJpbmdzQXNGYWN0b3JzID0gRikgCgpgYGAKYGBge3J9CmhlYWQoRTE2X0RlY19jdjNfSUQpCgpgYGAKCmBgYHtyfQpFMTZfRGVjX2N2M19uYW1lPC1nc3ViKCJ4IiwiIixFMTZfRGVjX2N2M19JRCkKaGVhZChFMTZfRGVjX2N2M19uYW1lKQpgYGAKYGBge3J9CkUxNl9EZWNfY3YzX25hbWU8LWdzdWIoIjoiLCJfIixFMTZfRGVjX2N2M19uYW1lKQpoZWFkKEUxNl9EZWNfY3YzX25hbWUpCmBgYApgYGB7cn0KVFNORTFfTG9vbW9yZGVyX2VwaTwtRTE2X0RlYzd2M19lcGlAZHIkdHNuZUBjZWxsLmVtYmVkZGluZ3NbbWF0Y2goRTE2X0RlY19jdjNfbmFtZSxyb3duYW1lcyhFMTZfRGVjN3YzX2VwaUBkciR0c25lQGNlbGwuZW1iZWRkaW5ncykpLDFdCndyaXRlKFRTTkUxX0xvb21vcmRlcl9lcGksIlRTTkUxX0xvb21vcmRlcl9lcGkuY3N2IixuY29sdW1ucz0xLHNlcD0iLCIpCmBgYApgYGB7cn0KaGVhZChUU05FMV9Mb29tb3JkZXJfZXBpKQpgYGAKYGBge3J9ClRTTkUyX0xvb21vcmRlcl9lcGk8LUUxNl9EZWM3djNfZXBpQGRyJHRzbmVAY2VsbC5lbWJlZGRpbmdzW21hdGNoKEUxNl9EZWNfY3YzX25hbWUscm93bmFtZXMoRTE2X0RlYzd2M19lcGlAZHIkdHNuZUBjZWxsLmVtYmVkZGluZ3MpKSwyXQp3cml0ZShUU05FMl9Mb29tb3JkZXJfZXBpLCJUU05FMl9Mb29tb3JkZXJfZXBpLmNzdiIsbmNvbHVtbnM9MSxzZXA9IiwiKQoKYGBgCiMjIyMjIG1hcmtlcnMgZm9yIGVhY2ggY2lsaWF0ZWQgcG9wdWxhdGlvbjoKYGBge3J9CkUxNl9EZWNfZXBpX3JlczEyXzhvdmVyMTAxMTwtRmluZE1hcmtlcnMoRTE2X0RlYzd2M19lcGksaWRlbnQuMT1jKDgpLGlkZW50LjIgPSBjKDEwLDExKSxvbmx5LnBvcyA9IFRSVUUpCkUxNl9EZWNfZXBpX3JlczEyXzhvdmVyMTAxMQpgYGAKYGBge3J9CndyaXRlLnRhYmxlKEUxNl9EZWNfZXBpX3JlczEyXzhvdmVyMTAxMSwiZXBpU3Vic2V0X2M4aW5DaWxpYS50eHQiLHNlcD0iXHQiKQoKYGBgCgoKYGBge3J9CkUxNl9EZWNfZXBpX3JlczEyXzEwb3ZlcjgxMTwtRmluZE1hcmtlcnMoRTE2X0RlYzd2M19lcGksaWRlbnQuMT1jKDEwKSxpZGVudC4yID0gYyg4LDExKSxvbmx5LnBvcyA9IFRSVUUpCkUxNl9EZWNfZXBpX3JlczEyXzEwb3ZlcjgxMQpgYGAKYGBge3J9CkUxNl9EZWNfZXBpX3JlczEyXzEwb3Zlcjg8LUZpbmRNYXJrZXJzKEUxNl9EZWM3djNfZXBpLGlkZW50LjE9YygxMCksaWRlbnQuMiA9IGMoOCksb25seS5wb3MgPSBUUlVFKQpFMTZfRGVjX2VwaV9yZXMxMl8xMG92ZXI4CmBgYApgYGB7cn0Kd3JpdGUudGFibGUoRTE2X0RlY19lcGlfcmVzMTJfMTBvdmVyOCwiZXBpU3Vic2V0X2MxMG92ZXJDOC50eHQiLHNlcD0iXHQiKQoKYGBgCgpgYGB7cn0KRTE2X0RlYzd2M19lcGkgPC0gU2V0QWxsSWRlbnQob2JqZWN0ID0gRTE2X0RlYzd2M19lcGksIGlkID0gInJlcy4xLjIiKQoKRTE2X0RlY19lcGlfcmVzMTJfMTBvdmVyMTE8LUZpbmRNYXJrZXJzKEUxNl9EZWM3djNfZXBpLGlkZW50LjE9YygxMCksaWRlbnQuMiA9IGMoMTEpLG9ubHkucG9zID0gVFJVRSkKRTE2X0RlY19lcGlfcmVzMTJfMTBvdmVyMTEKYGBgCmBgYHtyfQp3cml0ZS50YWJsZShFMTZfRGVjX2VwaV9yZXMxMl8xMG92ZXIxMSwiZXBpU3Vic2V0X2MxMG92ZXJDMTEudHh0IixzZXA9Ilx0IikKCmBgYAoKYGBge3J9CkUxNl9EZWNfZXBpX3JlczEyXzExb3ZlcjgxMDwtRmluZE1hcmtlcnMoRTE2X0RlYzd2M19lcGksaWRlbnQuMT1jKDExKSxpZGVudC4yID0gYyg4LDEwKSxvbmx5LnBvcyA9IFRSVUUpCkUxNl9EZWNfZXBpX3JlczEyXzExb3ZlcjgxMApgYGAKCmBgYHtyfQp3cml0ZS50YWJsZShFMTZfRGVjX2VwaV9yZXMxMl8xMW92ZXI4MTAsImVwaVN1YnNldF9jMTFpbkNpbGlhLnR4dCIsc2VwPSJcdCIpCgpgYGAKCgoKYGBge3IsZmlnLmhlaWdodD00LGZpZy53aWR0aD0xNn0KRTE2X0RlYzd2M19lcGkgPC0gU2V0QWxsSWRlbnQob2JqZWN0ID0gRTE2X0RlYzd2M19lcGksIGlkID0gInJlcy4xLjIiKQoKRG9IZWF0bWFwKG9iamVjdCA9IEUxNl9EZWM3djNfZXBpLCBnZW5lcy51c2UgPSBjKCJGb3hqMSIsIlRvcDJhIiwiTWNpZGFzIiwiQ2NubyIsIkZveG40IiwiU2hpc2E4IiwiTHJyYzIzIiwiUHJyMTgiLCJDZmFwNTMiLCJDZGhyMyIsIlNudG4iLCJJZml0bTEiLCJMYnAiLCJMeTZjMSIsIkx5NmEiKSwgCiAgICBzbGltLmNvbC5sYWJlbCA9IFRSVUUsIGdyb3VwLmxhYmVsLnJvdCA9IFRSVUUsdXNlLnNjYWxlZCA9IEYsY2VsbHMudXNlID0gRTE2X0RlYzd2M19lcGlAY2VsbC5uYW1lc1tFMTZfRGVjN3YzX2VwaUBtZXRhLmRhdGEkcmVzLjEuMiAlaW4lIGMoOCwxMCwxMSldLGdyb3VwLm9yZGVyID0gYyg4LDEwLDExKSxncm91cC5jZXggPSAzMCxjZXgucm93ID0gMjAKICApCmBgYAoKCiMjIyMjIHNjb3Jpbmc6CmBgYHtyLGZpZy5oZWlnaHQ9NCxmaWcud2lkdGg9Mjh9CkUxNl9EZWM3djNfZXBpQGRhdGFbMTo2LDE6Nl0KCmBgYAoKYGBge3IsZmlnLmhlaWdodD00LGZpZy53aWR0aD0yOH0KcGVyY2VudGlsZV90YWJsZV9lcGk8LWFwcGx5KEUxNl9EZWM3djNfZXBpQGRhdGEsMSxwZXJjZW50X3JhbmspCgpgYGAKYGBge3IsZmlnLmhlaWdodD00LGZpZy53aWR0aD0yOH0KcGVyY2VudGlsZV90YWJsZV9lcGlbMTo2LDE6Nl0KCmBgYAoKCmBgYHtyfQpPTUlNZ2VuZTwtcmVhZC5jc3YoZmlsZSA9ICJnZW5lc09NSU0uY3N2IixoZWFkZXI9VCxzZXA9IiwiLHN0cmluZ3NBc0ZhY3RvcnMgPSBGKQpPTUlNZ2VuZTwtbGFwcGx5KE9NSU1nZW5lLGZ1bmN0aW9uKHgpIHVubGlzdChzdHJzcGxpdCh1bmxpc3QoeCksc3BsaXQ9IiwiKSkpIApoZWFkKE9NSU1nZW5lJE11Y29jaWxpYXJ5KQpgYGAKYGBge3J9Ck9NSU1nZW5lX211Y29zYUdvYmxldDwtYXMudmVjdG9yKHJlYWQuY3N2KGZpbGUgPSAiZ2VuZXNPTUlNX211Y29zYV9nb2JsZXQuY3N2IixoZWFkZXI9VCxzZXA9IiwiLHN0cmluZ3NBc0ZhY3RvcnMgPSBGKVssMV0pCk9NSU1nZW5lX211Y29zYUdvYmxldDwtdW5saXN0KHN0cnNwbGl0KHVubGlzdChPTUlNZ2VuZV9tdWNvc2FHb2JsZXQpLHNwbGl0PSIsIikpCk9NSU1nZW5lX211Y29zYUdvYmxldFs5MDoxMDVdCmBgYApgYGB7cn0KIG1vY29zYUdvYmxldF9zY29yZTwtIGFwcGx5KHBlcmNlbnRpbGVfdGFibGVfZXBpWyxjb2xuYW1lcyhwZXJjZW50aWxlX3RhYmxlX2VwaSkgJWluJSBPTUlNZ2VuZV9tdWNvc2FHb2JsZXRdLDEsbWVhbikKYGBgCmBgYHtyfQogaGVhZCggbW9jb3NhR29ibGV0X3Njb3JlKQpgYGAKYGBge3J9CkUxNl9EZWM3djNfZXBpPC1BZGRNZXRhRGF0YShvYmplY3QgPSBFMTZfRGVjN3YzX2VwaSwgbWV0YWRhdGEgPSBtb2Nvc2FHb2JsZXRfc2NvcmUsIGNvbC5uYW1lID0gIm1vY29zYUdvYmxldF9zY29yZSIpCgpgYGAKYGBge3J9ClZsblBsb3Qob2JqZWN0ID0gRTE2X0RlYzd2M19lcGksIGZlYXR1cmVzLnBsb3QgPSBjKCJtb2Nvc2FHb2JsZXRfc2NvcmUiKSwgbkNvbCA9IDEseC5sYWIucm90ID0gVCxwb2ludC5zaXplLnVzZSA9IDAuMyx1c2UucmF3PUYsZ3JvdXAuYnk9InJlcy4xLjQiKQoKYGBgCgoKCgoKYGBge3J9CiBjaWxpb3BhdGh5X3RhYmxlPC0gcGVyY2VudGlsZV90YWJsZV9lcGlbLGNvbG5hbWVzKHBlcmNlbnRpbGVfdGFibGVfZXBpKSAlaW4lIE9NSU1nZW5lJENpbGlvcGF0aHldCmBgYAoKYGBge3J9CiBjaWxpb3BhdGh5X3Njb3JlPC0gYXBwbHkoY2lsaW9wYXRoeV90YWJsZSwxLG1lYW4pCmBgYApgYGB7cn0KIGhlYWQoY2lsaW9wYXRoeV9zY29yZSkKYGBgCmBgYHtyfQogUENEX3Njb3JlPC0gYXBwbHkocGVyY2VudGlsZV90YWJsZV9lcGlbLGNvbG5hbWVzKHBlcmNlbnRpbGVfdGFibGVfZXBpKSAlaW4lIE9NSU1nZW5lJFByaW1hcnkuY2lsaWFyeS5keXNraW5lc2lhXSwxLG1lYW4pCmBgYApgYGB7cn0KIGhlYWQoUENEX3Njb3JlKQpgYGAKCmBgYHtyfQpFMTZfRGVjN3YzX2VwaTwtQWRkTWV0YURhdGEob2JqZWN0ID0gRTE2X0RlYzd2M19lcGksIG1ldGFkYXRhID0gY2lsaW9wYXRoeV9zY29yZSwgY29sLm5hbWUgPSAiY2lsaW9wYXRoeV9zY29yZSIpCgpgYGAKYGBge3J9CkUxNl9EZWM3djNfZXBpPC1BZGRNZXRhRGF0YShvYmplY3QgPSBFMTZfRGVjN3YzX2VwaSwgbWV0YWRhdGEgPSBQQ0Rfc2NvcmUsIGNvbC5uYW1lID0gIlBDRF9zY29yZSIpCgpgYGAKYGBge3J9ClZsblBsb3Qob2JqZWN0ID0gRTE2X0RlYzd2M19lcGksIGZlYXR1cmVzLnBsb3QgPSBjKCJjaWxpb3BhdGh5X3Njb3JlIiksIG5Db2wgPSAxLHgubGFiLnJvdCA9IFQscG9pbnQuc2l6ZS51c2UgPSAwLjMsdXNlLnJhdz1GLGdyb3VwLmJ5PSJyZXMuMS4yIikKCmBgYApgYGB7cn0KVmxuUGxvdChvYmplY3QgPSBFMTZfRGVjN3YzX2VwaSwgZmVhdHVyZXMucGxvdCA9IGMoIlBDRF9zY29yZSIpLCBuQ29sID0gMSx4LmxhYi5yb3QgPSBULHBvaW50LnNpemUudXNlID0gMC4zLHVzZS5yYXc9Rixncm91cC5ieT0icmVzLjEuMiIpCgpgYGAKYGBge3J9ClZsblBsb3Qob2JqZWN0ID0gRTE2X0RlYzd2M19lcGksIGZlYXR1cmVzLnBsb3QgPSBjKCJQQ0Rfc2NvcmUiKSwgbkNvbCA9IDEsaWRlbnQuaW5jbHVkZSA9IGMoOCwxMCwxMSkseC5sYWIucm90ID0gVCxwb2ludC5zaXplLnVzZSA9IDAuMyx1c2UucmF3PUYsZ3JvdXAuYnk9InJlcy4xLjIiKQoKYGBgCgpgYGB7cn0KRTE2X0RlYzd2M19lcGkgPC0gU2V0QWxsSWRlbnQob2JqZWN0ID0gRTE2X0RlYzd2M19lcGksIGlkID0gInJlcy4xLjIiKQoKVmxuUGxvdChvYmplY3QgPSBFMTZfRGVjN3YzX2VwaSwgZmVhdHVyZXMucGxvdCA9IGMoImNpbGlvcGF0aHlfc2NvcmUiKSwgaWRlbnQuaW5jbHVkZSA9IGMoMTEpLG5Db2wgPSAxLHgubGFiLnJvdCA9IFQscG9pbnQuc2l6ZS51c2UgPSAwLjMsdXNlLnJhdz1GLGdyb3VwLmJ5PSJzZXFfZ3JvdXAiKQoKYGBgCmBgYHtyfQpFMTZfRGVjN3YzX2VwaSA8LSBTZXRBbGxJZGVudChvYmplY3QgPSBFMTZfRGVjN3YzX2VwaSwgaWQgPSAicmVzLjEuMiIpCgpWbG5QbG90KG9iamVjdCA9IEUxNl9EZWM3djNfZXBpLCBmZWF0dXJlcy5wbG90ID0gYygiUENEX3Njb3JlIiksIGlkZW50LmluY2x1ZGUgPSBjKDgpLG5Db2wgPSAxLHgubGFiLnJvdCA9IFQscG9pbnQuc2l6ZS51c2UgPSAwLjMsdXNlLnJhdz1GLGdyb3VwLmJ5PSJzZXFfZ3JvdXAiKQoKYGBgCmBgYHtyfQogbXVjdXNfc2NvcmU8LSBhcHBseShwZXJjZW50aWxlX3RhYmxlX2VwaVssY29sbmFtZXMocGVyY2VudGlsZV90YWJsZV9lcGkpICVpbiUgYyhPTUlNZ2VuZSRBaXJ3YXkuLi5NdWN1cyxPTUlNZ2VuZSRQdWxtb25hcnkuYW5kLk11Y3VzKV0sMSxtZWFuKQpgYGAKYGBge3J9CiBoZWFkKG11Y3VzX3Njb3JlKQpgYGAKYGBge3J9CkUxNl9EZWM3djNfZXBpPC1BZGRNZXRhRGF0YShvYmplY3QgPSBFMTZfRGVjN3YzX2VwaSwgbWV0YWRhdGEgPSBtdWN1c19zY29yZSwgY29sLm5hbWUgPSAibXVjdXNfc2NvcmUiKQoKYGBgCgpgYGB7cn0KVmxuUGxvdChvYmplY3QgPSBFMTZfRGVjN3YzX2VwaSwgZmVhdHVyZXMucGxvdCA9IGMoIm11Y3VzX3Njb3JlIiksIG5Db2wgPSAxLHgubGFiLnJvdCA9IFQscG9pbnQuc2l6ZS51c2UgPSAwLjMsdXNlLnJhdz1GLGdyb3VwLmJ5PSJyZXMuMS40IikKCmBgYApgYGB7cn0KIENPUERfc2NvcmU8LSBhcHBseShwZXJjZW50aWxlX3RhYmxlX2VwaVssY29sbmFtZXMocGVyY2VudGlsZV90YWJsZV9lcGkpICVpbiUgYyhPTUlNZ2VuZSRDT1BEKV0sMSxtZWFuKQpgYGAKYGBge3J9CiBoZWFkKENPUERfc2NvcmUpCmBgYApgYGB7cn0KRTE2X0RlYzd2M19lcGk8LUFkZE1ldGFEYXRhKG9iamVjdCA9IEUxNl9EZWM3djNfZXBpLCBtZXRhZGF0YSA9IENPUERfc2NvcmUsIGNvbC5uYW1lID0gIkNPUERfc2NvcmUiKQoKYGBgCgpgYGB7cn0KVmxuUGxvdChvYmplY3QgPSBFMTZfRGVjN3YzX2VwaSwgZmVhdHVyZXMucGxvdCA9IGMoIkNPUERfc2NvcmUiKSwgbkNvbCA9IDEseC5sYWIucm90ID0gVCxwb2ludC5zaXplLnVzZSA9IDAuMyx1c2UucmF3PUYsZ3JvdXAuYnk9InJlcy4xLjQiKQoKYGBgCgpgYGB7cn0KIGFzdGhtYV9zY29yZTwtIGFwcGx5KHBlcmNlbnRpbGVfdGFibGVfZXBpWyxjb2xuYW1lcyhwZXJjZW50aWxlX3RhYmxlX2VwaSkgJWluJSBjKE9NSU1nZW5lJFB1bG1vbmFyeS4uLkFzdGhtYSldLDEsbWVhbikKYGBgCmBgYHtyfQogaGVhZChhc3RobWFfc2NvcmUpCmBgYApgYGB7cn0KRTE2X0RlYzd2M19lcGk8LUFkZE1ldGFEYXRhKG9iamVjdCA9IEUxNl9EZWM3djNfZXBpLCBtZXRhZGF0YSA9IGFzdGhtYV9zY29yZSwgY29sLm5hbWUgPSAiYXN0aG1hX3Njb3JlIikKCmBgYAoKYGBge3J9ClZsblBsb3Qob2JqZWN0ID0gRTE2X0RlYzd2M19lcGksIGZlYXR1cmVzLnBsb3QgPSBjKCJhc3RobWFfc2NvcmUiKSwgbkNvbCA9IDEseC5sYWIucm90ID0gVCxwb2ludC5zaXplLnVzZSA9IDAuMyx1c2UucmF3PUYsZ3JvdXAuYnk9InJlcy4xLjQiKQoKYGBgCmBgYHtyLCBmaWcuaGVpZ2h0PTUsIGZpZy53aWR0aD0xNH0KZ2dwbG90KEUxNl9EZWM3djNfZXBpQG1ldGEuZGF0YSxhZXMoZ2Vub3R5cGUsYXN0aG1hX3Njb3JlKSkrZmFjZXRfZ3JpZCgufnJlcy4xLjIpK2dlb21fZG90cGxvdChiaW5heGlzPSJ5IixhZXMoY29sb3I9Z2Vub3R5cGUsZmlsbD1nZW5vdHlwZSksYmlud2lkdGg9MC4wNSxzdGFja2Rpcj0iY2VudGVyIixwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSgwLjgpLCBkb3RzaXplPTAuMikrc3RhdF9jb21wYXJlX21lYW5zKGNvbXBhcmlzb25zID0gbGlzdChjKCJ3dCIsICJtdXQiKSksbWV0aG9kPSJ3aWxjb3gudGVzdCIsc2l6ZT00LGxhYmVsPSJwLmFkaiIpKyBzdGF0X3N1bW1hcnkoYWVzKGNvbG9yPWdlbm90eXBlKSxmdW4uZGF0YT1tZWFuX3NkbCwgZnVuLmFyZ3MgPSBsaXN0KG11bHQ9MSksIAogICAgICAgICAgICAgICAgIGdlb209InBvaW50cmFuZ2UiLHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKDAuNykpKyB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LGhqdXN0PTEpKQpgYGAKCgoKCmBgYHtyfQpyZXMudXNlZCA8LSAxLjQKYGBgCmBgYHtyfQpFMTZfRGVjN3YzX2VwaSA8LSBGaW5kQ2x1c3RlcnMob2JqZWN0ID0gRTE2X0RlYzd2M19lcGksIHJlZHVjdGlvbi50eXBlID0gInBjYSIsIGRpbXMudXNlID0gMTpuLnBjcy5zdWIsIAogICAgICAgICAgICAgICAgICAgICByZXNvbHV0aW9uID0gcmVzLnVzZWQsIHByaW50Lm91dHB1dCA9IDAsIGZvcmNlLnJlY2FsYyA9IFQpCmBgYApgYGB7cn0KRTE2X0RlYzd2M19lcGkgPC0gUnVuVFNORShvYmplY3QgPSBFMTZfRGVjN3YzX2VwaSwgZGltcy51c2UgPSAxOm4ucGNzLnN1YiwgcGVycGxleGl0eT0zMCkKYGBgCmBgYHtyLCBmaWcud2lkdGg9MTAsZmlnLmhlaWdodD05fQpUU05FUGxvdChvYmplY3QgPSBFMTZfRGVjN3YzX2VwaSwgZG8ubGFiZWwgPSBULHB0LnNpemUgPSAwLjQpCmBgYAoKCmBgYHtyLGZpZy5oZWlnaHQ9OCxmaWcud2lkdGg9MjJ9CkUxNl9EZWM3djNfZXBpPWJ1aWxkQ2x1c3RlclRyZWUoRTE2X0RlYzd2M19lcGksZG8ucmVvcmRlciA9IEYscmVvcmRlci5udW1lcmljID0gRixwY3MudXNlID0gMToxNykKCmBgYAoKCmBgYHtyfQp0YWJsZShFMTZfRGVjN3YzX2VwaUBtZXRhLmRhdGEkcmVzLjEuNCxFMTZfRGVjN3YzX2VwaUBtZXRhLmRhdGEkc2VxX2dyb3VwKQpgYGAKCmBgYHtyfQpwcm9wLnRhYmxlKHRhYmxlKEUxNl9EZWM3djNfZXBpQG1ldGEuZGF0YSRyZXMuMS40LEUxNl9EZWM3djNfZXBpQG1ldGEuZGF0YSRzZXFfZ3JvdXApLDIpCmBgYAoKCmBgYHtyLGZpZy5oZWlnaHQ9OSxmaWcud2lkdGg9Mjh9CgpEb0hlYXRtYXAob2JqZWN0ID0gRTE2X0RlYzd2M19lcGksIGdlbmVzLnVzZSA9IGMoIkVwY2FtIiwiVHJwNjMiLCJLcnQ1IiwiU29zdGRjMSIsIkNvbDZhMSIsIkNvbDZhMiIsIkNvbDZhMyIsIkJnbiIsIlBvc3RuIiwiVGsxIiwiTWtpNjciLCJUb3AyYSIsIkNyZWIzbDEiLCJNdWM1YWMiLCJHcDIiLCJSYWMyIiwiMTgxMDAxMEgyNFJpayIsIktydDE1IiwiS3J0NCIsIktydDEzIiwibXQtQ28zIiwibXQtQ3l0YiIsIkdhbG50NiIsIlB0Z2RyIiwiQjNnbnQ2IiwiQ2QxNzciLCJGb3huNCIsIkZveGoxIiwiQ2RocjMiLCJBbm8xIiksIAogICAgc2xpbS5jb2wubGFiZWwgPSBUUlVFLCBncm91cC5sYWJlbC5yb3QgPSBUUlVFLHVzZS5zY2FsZWQgPSBULGdyb3VwLmJ5PSJyZXMuMS40IixjZXgucm93ID0gMjAKICApCmBgYApgYGB7cn0KVmxuUGxvdChvYmplY3QgPSBFMTZfRGVjN3YzX2VwaSwgZmVhdHVyZXMucGxvdCA9IGMoImRvdWJsZXRfc2NvcmUiKSwgbkNvbCA9IDEseC5sYWIucm90ID0gVCxwb2ludC5zaXplLnVzZSA9IDAuMyx1c2UucmF3PUYsZ3JvdXAuYnk9InJlcy4xLjQiKQoKYGBgCmBgYHtyfQpFMTZfRGVjN3YzX2VwaUBtZXRhLmRhdGEkY2VsbF90eXBlPC1tYXB2YWx1ZXMoRTE2X0RlYzd2M19lcGlAbWV0YS5kYXRhJHJlcy4xLjQsZnJvbT1jKCIwIiwiMSIsIjIiLCIzIiwiNCIsIjUiLCI2IiwiNyIsIjgiLCI5IiwiMTAiLCIxMSIsIjEyIiwiMTMiLCIxNCIsIjE1IiwiMTYiLCIxNyIsIjE4IiksdG89YygiQmFzYWwiLCJCYXNhbCIsIlNlY3JldG9yeSIsIkJhc2FsL1NlY3JldG9yeSIsIlNlY3JldG9yeSIsIlNlY3JldG9yeSIsIlNlY3JldG9yeSIsIkNpbGlhdGVkIiwiU2VjcmV0b3J5IiwiU2VjcmV0b3J5IiwiU2VjcmV0b3J5IiwiQ2lsaWF0ZWQiLCJTZWNyZXRvcnkiLCJCYXNhbCIsIkRvdWJsZXQiLCJDaWxpYXRlZCIsIlNlY3JldG9yeSIsIkRvdWJsZXQiLCJEb3VibGV0IikpCmBgYAoKCiMjIyMjIGMxNCwgMTcgYW5kIGMxOCBhcmUgZG91YmxldHMuCmBgYHtyLGZpZy53aWR0aD01LGZpZy5oZWlnaHQ9NX0KZ2dwbG90KGRhdGE9RTE2X0RlYzd2M19lcGlAbWV0YS5kYXRhWyEoRTE2X0RlYzd2M19lcGlAbWV0YS5kYXRhJHJlcy4xLjQgJWluJSBjKDE0LDE3LDE4KSksXSxhZXMoc2VxX2dyb3VwLGZpbGw9Y2VsbF90eXBlKSkrIAogICAgZ2VvbV9iYXIocG9zaXRpb249ImZpbGwiKSsgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxKSkKYGBgCgpgYGB7cixmaWcud2lkdGg9NSxmaWcuaGVpZ2h0PTV9CmdncGxvdChkYXRhPUUxNl9EZWM3djNfZXBpQG1ldGEuZGF0YVshKEUxNl9EZWM3djNfZXBpQG1ldGEuZGF0YSRyZXMuMS40ICVpbiUgYygxNCwxNywxOCkpLF0sYWVzKGdlbm90eXBlLGZpbGw9Y2VsbF90eXBlKSkrIAogICAgZ2VvbV9iYXIocG9zaXRpb249ImZpbGwiKSsgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxKSkKYGBgCmBgYHtyLGZpZy53aWR0aD01LGZpZy5oZWlnaHQ9NX0KdGFibGUoRTE2X0RlYzd2M19lcGlAbWV0YS5kYXRhJGNlbGxfdHlwZVshKEUxNl9EZWM3djNfZXBpQG1ldGEuZGF0YSRyZXMuMS40ICVpbiUgYygxNCwxNywxOCkpXSxFMTZfRGVjN3YzX2VwaUBtZXRhLmRhdGEkZ2Vub3R5cGVbIShFMTZfRGVjN3YzX2VwaUBtZXRhLmRhdGEkcmVzLjEuNCAlaW4lIGMoMTQsMTcsMTgpKV0pCmBgYApgYGB7cn0KREVfRTE2X3NlY3JldG9yeV9nZW5vdHlwZTwtRmluZE1hcmtlcnMoRTE2X0RlYzd2M19lcGksY2VsbHMuMTwtV2hpY2hDZWxscyhvYmplY3Q9RTE2X0RlYzd2M19lcGksY2VsbHMudXNlID0gKEUxNl9EZWM3djNfZXBpQG1ldGEuZGF0YSRnZW5vdHlwZT09Ind0IiAmIEUxNl9EZWM3djNfZXBpQG1ldGEuZGF0YSRjZWxsX3R5cGU9PSJTZWNyZXRvcnkiICkpLGNlbGxzLjI8LVdoaWNoQ2VsbHMob2JqZWN0PUUxNl9EZWM3djNfZXBpLGNlbGxzLnVzZSA9IChFMTZfRGVjN3YzX2VwaUBtZXRhLmRhdGEkZ2Vub3R5cGU9PSJtdXQiICYgRTE2X0RlYzd2M19lcGlAbWV0YS5kYXRhJGNlbGxfdHlwZT09IlNlY3JldG9yeSIgKSksb25seS5wb3MgPSBGLGxvZ2ZjLnRocmVzaG9sZD0wLG1pbi5wY3Q9MCkKREVfRTE2X3NlY3JldG9yeV9nZW5vdHlwZQpgYGAKYGBge3J9CmxpYnJhcnkoZ2dyZXBlbCkKYGBgCmBgYHtyfQpERV9FMTZfc2VjcmV0b3J5X2dlbm90eXBlJGdlbmU8LXJvd25hbWVzKERFX0UxNl9zZWNyZXRvcnlfZ2Vub3R5cGUpCkRFX0UxNl9zZWNyZXRvcnlfZ2Vub3R5cGUkc2lnPC1ERV9FMTZfc2VjcmV0b3J5X2dlbm90eXBlJHBfdmFsX2FkajwwLjAwMQp2b2xjID0gZ2dwbG90KERFX0UxNl9zZWNyZXRvcnlfZ2Vub3R5cGUsIGFlcyhhdmdfbG9nRkMsIC1sb2cxMChwX3ZhbF9hZGopKSkgKyAjdm9sY2Fub3Bsb3Qgd2l0aCBhdmdfbG9nRkMgdmVyc3VzIHBfdmFsX2FkagogICAgZ2VvbV9wb2ludChhZXMoY29sPXNpZykpICsgI2FkZCBwb2ludHMgY29sb3JlZCBieSBzaWduaWZpY2FuY2UKICAgIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXM9YygiYmxhY2siLCAicmVkIikpICsgCiAgICBnZ3RpdGxlKCJFMTZzZWNyZXRvcnlfd3QvbXV0IikgKyBnZW9tX3RleHRfcmVwZWwoZGF0YT1oZWFkKERFX0UxNl9zZWNyZXRvcnlfZ2Vub3R5cGUsIDQwKSwgYWVzKGxhYmVsPWdlbmUpLCBwb2ludC5wYWRkaW5nID0gMSwgYm94LnBhZGRpbmcgPSAuMykgKwogIGxhYnMoeSA9IGV4cHJlc3Npb24oLWxvZ1sxMF0qIiAiKiJhZGp1c3RlZCBwdmFsdWUiKSwgeCA9ICJhdmcgbG9nIGZvbGQgY2hhbmdlIikgKyAKICB0aGVtZShsZWdlbmQudGl0bGUgPSBlbGVtZW50X2JsYW5rKCksIGxlZ2VuZC5wb3NpdGlvbiA9ICJ0b3AiKSArIAogIHNjYWxlX2ZpbGxfZGlzY3JldGUobGFiZWxzID0gYygiTm90IFNpZyIsICJhZGp1c3RlZCBwdmFsIDwgMC4wMDEiKSkKYGBgCmBgYHtyfQp2b2xjCmBgYApgYGB7cn0KRTE2X0RlYzd2M19lcGlAbWV0YS5kYXRhJHNwZWNpZmljX3R5cGU8LW1hcHZhbHVlcyhFMTZfRGVjN3YzX2VwaUBtZXRhLmRhdGEkcmVzLjEuNCxmcm9tPWMoIjAiLCIxIiwiMiIsIjMiLCI0IiwiNSIsIjYiLCI3IiwiOCIsIjkiLCIxMCIsIjExIiwiMTIiLCIxMyIsIjE0IiwiMTUiLCIxNiIsIjE3IiwiMTgiKSx0bz1jKCJCYXNhbC1Tb3N0ZGMxIiwiQmFzYWwiLCJTZWNyZXRvcnktS3J0NCIsIkJhc2FsL1NlY3JldG9yeSIsIlNlY3JldG9yeS1LcnQ0IiwiU2VjcmV0b3J5IiwiU2VjcmV0b3J5LUtydDQiLCJDaWxpYXRlZCIsIlNlY3JldG9yeSIsIlNlY3JldG9yeS1LcnQ0IiwiU2VjcmV0b3J5LUtydDQiLCJDaWxpYXRlZCIsIkN5Y2xpbmdTZWNyZXRvcnkiLCJDeWNsaW5nQmFzYWwiLCJEb3VibGV0IiwiQ2lsaWF0ZWQiLCJTZWNyZXRvcnkiLCJEb3VibGV0IiwiRG91YmxldCIpKQpgYGAKCgpgYGB7cixmaWcud2lkdGg9NSxmaWcuaGVpZ2h0PTV9CnRhYmxlKEUxNl9EZWM3djNfZXBpQG1ldGEuZGF0YSRzcGVjaWZpY190eXBlWyEoRTE2X0RlYzd2M19lcGlAbWV0YS5kYXRhJHJlcy4xLjQgJWluJSBjKDE0LDE3LDE4KSldLEUxNl9EZWM3djNfZXBpQG1ldGEuZGF0YSRnZW5vdHlwZVshKEUxNl9EZWM3djNfZXBpQG1ldGEuZGF0YSRyZXMuMS40ICVpbiUgYygxNCwxNywxOCkpXSkKYGBgCgpgYGB7cixmaWcud2lkdGg9NSxmaWcuaGVpZ2h0PTV9CmdncGxvdChkYXRhPUUxNl9EZWM3djNfZXBpQG1ldGEuZGF0YVshKEUxNl9EZWM3djNfZXBpQG1ldGEuZGF0YSRyZXMuMS40ICVpbiUgYygxNCwxNywxOCkpLF0sYWVzKGdlbm90eXBlLGZpbGw9c3BlY2lmaWNfdHlwZSkpKyAKICAgIGdlb21fYmFyKHBvc2l0aW9uPSJmaWxsIikrIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSkpCmBgYAojIyMjIyBtYXJrZXJzIGZvciBzcGVjaWZpYyBjbHVzdGVyczoKYGBge3IsZmlnLmhlaWdodD0zLGZpZy53aWR0aD04fQpFMTZfRGVjN3YzX2VwaTwtU2V0QWxsSWRlbnQob2JqZWN0ID0gRTE2X0RlYzd2M19lcGksIGlkID0gInNwZWNpZmljX3R5cGUiKQoKRTE2X0RlYzd2M19lcGlAaWRlbnQ9ZmFjdG9yKEUxNl9EZWM3djNfZXBpQGlkZW50LGxldmVscyhFMTZfRGVjN3YzX2VwaUBpZGVudClbYyg0LDgsOSwyLDEsMyw2LDUsNyldKQpEb3RQbG90KG9iamVjdCA9IEUxNl9EZWM3djNfZXBpLCBjb2xzLnVzZSA9IGMoImxpZ2h0Z3JleSIsInJlZCIpLGdlbmVzLnBsb3QgPSBjKCJGb3hqMSIsIlB0Z2RyIiwiQjNnbnQ2IiwiR2FsbnQ2IiwiQ2dyZWYxIiwiR3AyIiwiVGZmMiIsIk11YzViIiwiTXVjMTYiLCJDaXRlZDEiLCJLcnQ0IiwiQ3JlYjNsMSIsIlNwZGVmIiwiQ2xpYzMiLCJDY2wyMCIsIlNvc3RkYzEiLCJTbW9jMiIsIktydDE0IiwiQm1wNyIsIlRycDYzIiwiS3J0NSIsIk1raTY3IiwiVG9wMmEiKSxncm91cC5ieSA9ICJpZGVudCIsIHgubGFiLnJvdCA9IFQscGxvdC5sZWdlbmQgPSBUKQpgYGAKCmBgYHtyLGZpZy5oZWlnaHQ9MyxmaWcud2lkdGg9OH0KRTE2X0RlYzd2M19lcGk8LVNldEFsbElkZW50KG9iamVjdCA9IEUxNl9EZWM3djNfZXBpLCBpZCA9ICJzcGVjaWZpY190eXBlIikKCkUxNl9EZWM3djNfZXBpQGlkZW50PWZhY3RvcihFMTZfRGVjN3YzX2VwaUBpZGVudCxsZXZlbHMoRTE2X0RlYzd2M19lcGlAaWRlbnQpW2MoNCw4LDksMiwxLDMsNiw1LDcpXSkKRG90UGxvdChvYmplY3QgPSBFMTZfRGVjN3YzX2VwaSwgY29scy51c2UgPSBjKCJmb3Jlc3RncmVlbiIsIm1hZ2VudGEzIiksZ2VuZXMucGxvdCA9IGMoIkZveGoxIiwiUHRnZHIiLCJCM2dudDYiLCJHYWxudDYiLCJDZ3JlZjEiLCJHcDIiLCJUZmYyIiwiTXVjNWIiLCJNdWMxNiIsIkNpdGVkMSIsIktydDQiLCJDcmViM2wxIiwiU3BkZWYiLCJDbGljMyIsIkNjbDIwIiwiU29zdGRjMSIsIlNtb2MyIiwiS3J0MTQiLCJCbXA3IiwiVHJwNjMiLCJLcnQ1IiwiTWtpNjciLCJUb3AyYSIpLGdyb3VwLmJ5ID0gImlkZW50IiwgeC5sYWIucm90ID0gVCxwbG90LmxlZ2VuZCA9IFQsY29sLm1heCA9IDIsY29sLm1pbiA9IC0yKQpgYGAKCgpgYGB7cixmaWcuaGVpZ2h0PTMsZmlnLndpZHRoPTh9CnByaW50KGxldmVscyhFMTZfRGVjN3YzX2VwaUBpZGVudCkpCmBgYAoKCmBgYHtyLGZpZy5oZWlnaHQ9NixmaWcud2lkdGg9Mjh9CgpEb0hlYXRtYXAob2JqZWN0ID0gRTE2X0RlYzd2M19lcGksIGdlbmVzLnVzZSA9IGMoIlRycDYzIiwiS3J0NSIsIktydDE0IiwiU29zdGRjMSIsIlRrMSIsIk1raTY3IiwiVG9wMmEiLCJTcGRlZiIsIkNyZWIzbDEiLCJNdWM1YiIsIk11YzVhYyIsIkdwMiIsIktydDE1IiwiS3J0NCIsIktydDEzIiwiRm94bjQiLCJNY2lkYXMiLCJGb3hqMSIsIkNkaHIzIiwiQW5vMSIpLCAKICAgIHNsaW0uY29sLmxhYmVsID0gVFJVRSwgZ3JvdXAubGFiZWwucm90ID0gVFJVRSx1c2Uuc2NhbGVkID0gVCxncm91cC5ieT0icmVzLjEuNCIsY2VsbHMudXNlID0gRTE2X0RlYzd2M19lcGlAY2VsbC5uYW1lc1shKEUxNl9EZWM3djNfZXBpQG1ldGEuZGF0YSRyZXMuMS40ICVpbiUgYygxNCwxNywxOCkpXQogICkKYGBgCmBgYHtyLGZpZy5oZWlnaHQ9MTUsZmlnLndpZHRoPTQ1fQoKRG9IZWF0bWFwKG9iamVjdCA9IEUxNl9EZWM3djNfZXBpLCBnZW5lcy51c2UgPSBjKCJUcnA2MyIsIktydDUiLCJLcnQxNCIsIlNvc3RkYzEiLCJUazEiLCJNa2k2NyIsIlRvcDJhIiwiU2Z0cGIiLCJLcnQ0IiwiS3J0MTMiLCJDbGljMyIsIlNwZGVmIiwiQ3JlYjNsMSIsIk11YzViIiwiR3AyIiwiRm94ajEiLCJBbm8xIiksIAogICAgc2xpbS5jb2wubGFiZWwgPSBUUlVFLCBncm91cC5sYWJlbC5yb3QgPSBUUlVFLHVzZS5zY2FsZWQgPSBULGdyb3VwLmJ5PSJzcGVjaWZpY190eXBlIixjZWxscy51c2UgPSBFMTZfRGVjN3YzX2VwaUBjZWxsLm5hbWVzWyEoRTE2X0RlYzd2M19lcGlAbWV0YS5kYXRhJHJlcy4xLjQgJWluJSBjKDE0LDE3LDE4KSldLGNleC5yb3cgPSAzMCxncm91cC5jZXggPSA1MCxncm91cC5vcmRlciA9IGMoIkJhc2FsLVNvc3RkYzEiLCJDeWNsaW5nQmFzYWwiLCJCYXNhbCIsIkJhc2FsL1NlY3JldG9yeSIsIkN5Y2xpbmdTZWNyZXRvcnkiLCJTZWNyZXRvcnktS3J0NCIsIlNlY3JldG9yeSIsIkNpbGlhdGVkIikKICApCmBgYAoKCmBgYHtyfQpzYXZlKEUxNl9EZWM3djNfZXBpLGZpbGU9IkUxNl9EZWM3djNfZXBpLlJEYXRhIikKYGBgCiMjIyMgZGlmZmVyZW50IHBvcHVsYXRpb25zIG9mIGJhc2FsIGNlbGxzOgpgYGB7cn0KRTE2X0RlYzd2M19lcGkgPC0gU2V0QWxsSWRlbnQob2JqZWN0ID0gRTE2X0RlYzd2M19lcGksIGlkID0gInJlcy4xLjQiKQpFMTZfRGVjX2VwaV9yZXMxNF8wb3ZlcjE8LUZpbmRNYXJrZXJzKEUxNl9EZWM3djNfZXBpLGlkZW50LjE9YygwKSxpZGVudC4yID0gYygxKSxvbmx5LnBvcyA9IFRSVUUpCkUxNl9EZWNfZXBpX3JlczE0XzBvdmVyMQpgYGAKYGBge3J9CndyaXRlLnRhYmxlKEUxNl9EZWNfZXBpX3JlczE0XzBvdmVyMSwiZXBpU3Vic2V0X3JlczE0X2Mwb3ZlckMxLnR4dCIsc2VwPSJcdCIpCgpgYGAKYGBge3J9CmxpYnJhcnkoZ2dyZXBlbCkKYGBgCmBgYHtyfQpFMTZfRGVjX2VwaV9yZXMxNF8wb3ZlcjEkZ2VuZTwtcm93bmFtZXMoRTE2X0RlY19lcGlfcmVzMTRfMG92ZXIxKQpFMTZfRGVjX2VwaV9yZXMxNF8wb3ZlcjEkc2lnPC1FMTZfRGVjX2VwaV9yZXMxNF8wb3ZlcjEkcF92YWxfYWRqPDAuMDAxCnZvbGMgPSBnZ3Bsb3QoRTE2X0RlY19lcGlfcmVzMTRfMG92ZXIxLCBhZXMoYXZnX2xvZ0ZDLCAtbG9nMTAocF92YWxfYWRqKSkpICsgI3ZvbGNhbm9wbG90IHdpdGggYXZnX2xvZ0ZDIHZlcnN1cyBwX3ZhbF9hZGoKICAgIGdlb21fcG9pbnQoYWVzKGNvbD1zaWcpKSArICNhZGQgcG9pbnRzIGNvbG9yZWQgYnkgc2lnbmlmaWNhbmNlCiAgICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzPWMoImJsYWNrIiwgInJlZCIpKSArIAogICAgZ2d0aXRsZSgiRTE2X2VwaV8wb3ZlcjEiKSAKCkUxNl9EZWNfZXBpX3JlczE0XzBvdmVyMV92b2xjLjEgPC0gdm9sYyArIGdlb21fdGV4dF9yZXBlbChkYXRhPWhlYWQoRTE2X0RlY19lcGlfcmVzMTRfMG92ZXIxLCAyMCksIGFlcyhsYWJlbD1nZW5lKSwgcG9pbnQucGFkZGluZyA9IDEsIGJveC5wYWRkaW5nID0gLjMpICsKICBsYWJzKHkgPSBleHByZXNzaW9uKC1sb2dbMTBdKiIgIioiYWRqdXN0ZWQgcHZhbHVlIiksIHggPSAiYXZnIGxvZyBmb2xkIGNoYW5nZSIpICsgCiAgdGhlbWUobGVnZW5kLnRpdGxlID0gZWxlbWVudF9ibGFuaygpLCBsZWdlbmQucG9zaXRpb24gPSAidG9wIikgKyAKICBzY2FsZV9maWxsX2Rpc2NyZXRlKGxhYmVscyA9IGMoIk5vdCBTaWciLCAiYWRqdXN0ZWQgcHZhbCA8IDAuMDAxIikpCmBgYApgYGB7cn0KRTE2X0RlY19lcGlfcmVzMTRfMG92ZXIxX3ZvbGMuMQpgYGAKCmBgYHtyfQpFMTZfRGVjN3YzX2VwaSA8LSBTZXRBbGxJZGVudChvYmplY3QgPSBFMTZfRGVjN3YzX2VwaSwgaWQgPSAicmVzLjEuNCIpCkUxNl9EZWNfZXBpX3JlczE0XzFvdmVyMDwtRmluZE1hcmtlcnMoRTE2X0RlYzd2M19lcGksaWRlbnQuMT1jKDEpLGlkZW50LjIgPSBjKDApLG9ubHkucG9zID0gVFJVRSkKRTE2X0RlY19lcGlfcmVzMTRfMW92ZXIwCmBgYApgYGB7cn0Kd3JpdGUudGFibGUoRTE2X0RlY19lcGlfcmVzMTRfMW92ZXIwLCJlcGlTdWJzZXRfcmVzMTRfYzFvdmVyQzAudHh0IixzZXA9Ilx0IikKCmBgYAoKYGBge3J9CkUxNl9EZWM3djNfZXBpIDwtIFNldEFsbElkZW50KG9iamVjdCA9IEUxNl9EZWM3djNfZXBpLCBpZCA9ICJyZXMuMS40IikKRTE2X0RlY19lcGlfcmVzMTRfOW92ZXIxPC1GaW5kTWFya2VycyhFMTZfRGVjN3YzX2VwaSxpZGVudC4xPWMoOSksaWRlbnQuMiA9IGMoMSksb25seS5wb3MgPSBUUlVFKQpFMTZfRGVjX2VwaV9yZXMxNF85b3ZlcjEKYGBgCmBgYHtyfQp3cml0ZS50YWJsZShFMTZfRGVjX2VwaV9yZXMxNF85b3ZlcjEsImVwaVN1YnNldF9yZXMxNF9jOW92ZXJDMS50eHQiLHNlcD0iXHQiKQoKYGBgCgpgYGB7cn0KRTE2X0RlYzd2M19lcGkgPC0gU2V0QWxsSWRlbnQob2JqZWN0ID0gRTE2X0RlYzd2M19lcGksIGlkID0gInJlcy4xLjQiKQpFMTZfRGVjX2VwaV9yZXMxNF8xb3Zlcjk8LUZpbmRNYXJrZXJzKEUxNl9EZWM3djNfZXBpLGlkZW50LjE9YygxKSxpZGVudC4yID0gYyg5KSxvbmx5LnBvcyA9IFRSVUUpCkUxNl9EZWNfZXBpX3JlczE0XzFvdmVyOQpgYGAKYGBge3J9CndyaXRlLnRhYmxlKEUxNl9EZWNfZXBpX3JlczE0XzFvdmVyOSwiZXBpU3Vic2V0X3JlczE0X2Mxb3ZlckM5LnR4dCIsc2VwPSJcdCIpCgpgYGAKYGBge3IsZmlnLmhlaWdodD04LGZpZy53aWR0aD0zMH0KRTE2X0RlYzd2M19lcGkgPC0gU2V0QWxsSWRlbnQob2JqZWN0ID0gRTE2X0RlYzd2M19lcGksIGlkID0gInJlcy4xLjQiKQpEb0hlYXRtYXAob2JqZWN0ID0gRTE2X0RlYzd2M19lcGksIGdlbmVzLnVzZSA9IGMoIkVwY2FtIiwiS3J0OCIsIlRycDYzIiwiS3J0NSIsIk1raTY3IiwiVG9wMmEiLCJTbW9jMiIsIkNjbDIwIiwiU29zdGRjMSIsIkJtcDciLCJDbGljMyIsIkNsZG4xMCIsIlRzcGFuMzMiLCJFaGYiLCJTZnRhMiIsIkNyaXAyIiwiTXNsbiIsIkN5cDJzMSIsIkNsZG4zIiwiQ2xkbjciLCJDbGRuNCIsIkFVMDIxMDkyIiwiVHNwYW4xIiwiQ2hhZCIsIlRzcGFuMTMiLCJLbGsxMCIsIktsazExIiwiS2xrMTMiLCJDZXMxZCIsIktydDQiLCJLcnQxMyIsIkNyZWIzbDEiLCJTcGRlZiIpLCAKICAgIHNsaW0uY29sLmxhYmVsID0gVFJVRSwgZ3JvdXAubGFiZWwucm90ID0gVFJVRSx1c2Uuc2NhbGVkID0gVCxjZWxscy51c2UgPSBFMTZfRGVjN3YzX2VwaUBjZWxsLm5hbWVzW0UxNl9EZWM3djNfZXBpQG1ldGEuZGF0YSRyZXMuMS40ICVpbiUgYygwLDEzLDEsMyw5KV0sZ3JvdXAub3JkZXIgPSBjKDAsMTMsMSwzLDkpLGNleC5yb3cgPSAyMCxncm91cC5jZXggPSAzMAogICkKYGBgCiMjIyMjIGRpZmZlcmVudCBwb3B1bGF0aW9ucyBvZiBjaWxpYXRlZCBjZWxsczoKYGBge3IsZmlnLmhlaWdodD01LGZpZy53aWR0aD0xNn0KRTE2X0RlYzd2M19lcGkgPC0gU2V0QWxsSWRlbnQob2JqZWN0ID0gRTE2X0RlYzd2M19lcGksIGlkID0gInJlcy4xLjQiKQoKRG9IZWF0bWFwKG9iamVjdCA9IEUxNl9EZWM3djNfZXBpLCBnZW5lcy51c2UgPSBjKCJGb3hqMSIsIlNoaXNhOCIsIk1jaWRhcyIsIkNjbm8iLCJQbGs0IiwiSHlsczEiLCJGb3huNCIsIkxycmMyMyIsIlBycjE4IiwiQ2ZhcDUzIiwiQ2RocjMiLCJDZGhyNCIsIkxkbHJhZDEiLCJTbnRuIiwiSWZpdG0xIiwiTGJwIiwiTHk2YzEiLCJMeTZhIiksIAogICAgc2xpbS5jb2wubGFiZWwgPSBUUlVFLCBncm91cC5sYWJlbC5yb3QgPSBUUlVFLHVzZS5zY2FsZWQgPSBULGNlbGxzLnVzZSA9IEUxNl9EZWM3djNfZXBpQGNlbGwubmFtZXNbRTE2X0RlYzd2M19lcGlAbWV0YS5kYXRhJHJlcy4xLjQgJWluJSBjKDcsMTEsMTUpXSxncm91cC5vcmRlciA9IGMoNywxMSwxNSksZ3JvdXAuY2V4ID0gMzAsY2V4LnJvdyA9IDIwCiAgKQpgYGAKIyMjIyMgZGlmZmVyZW50IHBvcHVsYXRpb25zIG9mIHNlY3JldG9yeSBjZWxsczoKYGBge3IsZmlnLmhlaWdodD0xMCxmaWcud2lkdGg9MzB9CkUxNl9EZWM3djNfZXBpIDwtIFNldEFsbElkZW50KG9iamVjdCA9IEUxNl9EZWM3djNfZXBpLCBpZCA9ICJyZXMuMS40IikKRG9IZWF0bWFwKG9iamVjdCA9IEUxNl9EZWM3djNfZXBpLCBnZW5lcy51c2UgPSBjKCJFcGNhbSIsIk1raTY3IiwiVG9wMmEiLCJTZnRwYiIsIkhwIiwiS3J0NCIsIktydDEzIiwiTGdhbHMzIiwiQ2xpYzMiLCJTZWMxNGwzIiwiS3J0OCIsIktydDE4IiwiTXVjMTYiLCJDcmViM2wxIiwiU3BkZWYiLCJNdWM1YWMiLCJNdWM1YiIsIkZveGEzIiwiRmticDExIiwiR2FsbnQxMiIsIkx0ZiIsIkdwMiIsIlRmZjIiLCJHYWxudDYiLCJQdGdkciIsIkNkMTc3IiksCiAgICBzbGltLmNvbC5sYWJlbCA9IFRSVUUsIGdyb3VwLmxhYmVsLnJvdCA9IFRSVUUsdXNlLnNjYWxlZCA9IFQsY2VsbHMudXNlID0gRTE2X0RlYzd2M19lcGlAY2VsbC5uYW1lc1tFMTZfRGVjN3YzX2VwaUBtZXRhLmRhdGEkcmVzLjEuNCAlaW4lIGMoNiwyLDQsNSwxMiw4LDEwLDE2KV0sZ3JvdXAub3JkZXIgPSBjKDEyLDYsNCwyLDEwLDUsOCwxNiksY2V4LmNvbD0xLGNleC5yb3cgPSAyMCxncm91cC5jZXggPSAzMAogICkKYGBgCgoKCmBgYHtyfQplcGlfbWFya2VyX2MwX3d0X211dDwtRmluZE1hcmtlcnMoRTE2X0RlYzd2M19lcGksY2VsbHMuMTwtV2hpY2hDZWxscyhvYmplY3Q9RTE2X0RlYzd2M19lcGksaWRlbnQ9MCxjZWxscy51c2UgPSBFMTZfRGVjN3YzX2VwaUBtZXRhLmRhdGEkZ2Vub3R5cGU9PSJ3dCIpLGNlbGxzLjI8LVdoaWNoQ2VsbHMob2JqZWN0PUUxNl9EZWM3djNfZXBpLGlkZW50PTAsY2VsbHMudXNlID0gRTE2X0RlYzd2M19lcGlAbWV0YS5kYXRhJGdlbm90eXBlPT0ibXV0Iiksb25seS5wb3MgPSBUUlVFKQplcGlfbWFya2VyX2MwX3d0X211dApgYGAKIyMjIyMgU29zdGRjMSBzZWVtcyB0byBiZSBkb3ducmVndWxhdGVkIGluIG11dGFudCBiYXNhbC1Tb3N0ZGMxIHBvcHVsYXRpb24uCgpgYGB7cn0KZXBpX21hcmtlcl9jMF9tdXRfd3Q8LUZpbmRNYXJrZXJzKEUxNl9EZWM3djNfZXBpLGNlbGxzLjE8LVdoaWNoQ2VsbHMob2JqZWN0PUUxNl9EZWM3djNfZXBpLGlkZW50PTAsY2VsbHMudXNlID0gRTE2X0RlYzd2M19lcGlAbWV0YS5kYXRhJGdlbm90eXBlPT0ibXV0IiksY2VsbHMuMjwtV2hpY2hDZWxscyhvYmplY3Q9RTE2X0RlYzd2M19lcGksaWRlbnQ9MCxjZWxscy51c2UgPSBFMTZfRGVjN3YzX2VwaUBtZXRhLmRhdGEkZ2Vub3R5cGU9PSJ3dCIpLG9ubHkucG9zID0gVFJVRSkKZXBpX21hcmtlcl9jMF9tdXRfd3QKYGBgCgoKYGBge3J9CkUxNl9EZWM3djNfZXBpQG1ldGEuZGF0YSR0eXBlX2dlbm90eXBlPC1hcy5mYWN0b3IocGFzdGUoRTE2X0RlYzd2M19lcGlAbWV0YS5kYXRhJGNlbGxfdHlwZSxFMTZfRGVjN3YzX2VwaUBtZXRhLmRhdGEkZ2Vub3R5cGUsc2VwPSJfIikpCmBgYApgYGB7cixmaWcuaGVpZ2h0PTYsZmlnLndpZHRoPTZ9CkUxNl9EZWM3djNfZXBpPC1TZXRBbGxJZGVudChvYmplY3QgPSBFMTZfRGVjN3YzX2VwaSwgaWQgPSAidHlwZV9nZW5vdHlwZSIpCgpFMTZfRGVjN3YzX2VwaUBpZGVudD1mYWN0b3IoRTE2X0RlYzd2M19lcGlAaWRlbnQsbGV2ZWxzKEUxNl9EZWM3djNfZXBpQGlkZW50KVtjKDEsNCwyLDMsOSwxMCw1LDYsNyw4KV0pICAjanVzdCB0byByZW9yZGVyIHRoZSBncm91cHMKRG90UGxvdChvYmplY3QgPSBFMTZfRGVjN3YzX2VwaSwgY29scy51c2UgPSBjKCJ5ZWxsb3ciLCJyZWQiKSxnZW5lcy5wbG90ID0gcmV2KGMoIlNmdHBhMSIsIk11YzVhYyIsIk11YzIiLCJNdWMyMCIsIk11YzViIiwiTXVjMSIsIk11YzE2IiwiTXVjNCIsIlBpZ3IiLCJMdGYiLCJMeXoyIiwiU2xwaSIsIkxjbjIiLCJTZnRwZCIsIlNmdHBiIiwiRGVmYjEiKSkseC5sYWIucm90ID0gVCxwbG90LmxlZ2VuZCA9IFQsZ3JvdXAuYnkgPSAiaWRlbnQiLGRvLnJldHVybj1UKStyb3RhdGUoKSsgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgdmp1c3QgPSAxLGhqdXN0PTEpKSAKYGBgCmBgYHtyLGZpZy5oZWlnaHQ9NixmaWcud2lkdGg9Nn0KRTE2X0RlYzd2M19lcGk8LVNldEFsbElkZW50KG9iamVjdCA9IEUxNl9EZWM3djNfZXBpLCBpZCA9ICJ0eXBlX2dlbm90eXBlIikKCkUxNl9EZWM3djNfZXBpQGlkZW50PWZhY3RvcihFMTZfRGVjN3YzX2VwaUBpZGVudCxsZXZlbHMoRTE2X0RlYzd2M19lcGlAaWRlbnQpW2MoMSw0LDIsMyw5LDEwLDUsNiw3LDgpXSkKRG90UGxvdChvYmplY3QgPSBFMTZfRGVjN3YzX2VwaSwgY29scy51c2UgPSBjKCJmb3Jlc3RncmVlbiIsIm1hZ2VudGEzIiksZ2VuZXMucGxvdCA9IHJldihjKCJOZmtiaWEiLCJOZmtiaXoiLCJSZXRubGEiLCJDeGNsMTciLCJDeGNsMTUiLCJDY2wyMCIsIkFyZWciLCJNdWM1YiIsIk11YzQiLCJQaWdyIiwiTHRmIiwiTHl6MiIsIlNscGkiLCJMY24yIiwiU2Z0cGQiLCJTZnRwYiIsIkRlZmIxIiwiTGdhbHMzIiwiSXRsbjEiKSkseC5sYWIucm90ID0gVCxwbG90LmxlZ2VuZCA9IFQsZ3JvdXAuYnkgPSAiaWRlbnQiLGRvLnJldHVybj1ULGNvbC5taW4gPSAtMixjb2wubWF4ID0gMikrcm90YXRlKCkrIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIHZqdXN0ID0gMSxoanVzdD0xKSkgCmBgYApgYGB7cn0KREVfRTE2X2NpbGlhdGVkX2dlbm90eXBlPC1GaW5kTWFya2VycyhFMTZfRGVjN3YzX2VwaSxjZWxscy4xPC1XaGljaENlbGxzKG9iamVjdD1FMTZfRGVjN3YzX2VwaSxjZWxscy51c2UgPSAoRTE2X0RlYzd2M19lcGlAbWV0YS5kYXRhJGdlbm90eXBlPT0id3QiICYgRTE2X0RlYzd2M19lcGlAbWV0YS5kYXRhJGNlbGxfdHlwZT09IkNpbGlhdGVkIiApKSxjZWxscy4yPC1XaGljaENlbGxzKG9iamVjdD1FMTZfRGVjN3YzX2VwaSxjZWxscy51c2UgPSAoRTE2X0RlYzd2M19lcGlAbWV0YS5kYXRhJGdlbm90eXBlPT0ibXV0IiAmIEUxNl9EZWM3djNfZXBpQG1ldGEuZGF0YSRjZWxsX3R5cGU9PSJDaWxpYXRlZCIgKSksb25seS5wb3MgPSBGLGxvZ2ZjLnRocmVzaG9sZD0wLG1pbi5wY3Q9MC4wNSkKREVfRTE2X2NpbGlhdGVkX2dlbm90eXBlCmBgYAoKYGBge3J9CndyaXRlLnRhYmxlKERFX0UxNl9jaWxpYXRlZF9nZW5vdHlwZSwiREVfRTE2X2NpbGlhdGVkX2dlbm90eXBlLnR4dCIsc2VwPSJcdCIpCmBgYAoKCmBgYHtyfQpERV9FMTZfY2lsaWF0ZWRfZ2Vub3R5cGUkZ2VuZTwtcm93bmFtZXMoREVfRTE2X2NpbGlhdGVkX2dlbm90eXBlKQpFMTZfY2lsaWF0ZWRfYXV0b21hdGljX2dlbmVMaXN0PC1ERV9FMTZfY2lsaWF0ZWRfZ2Vub3R5cGUkZ2VuZVtERV9FMTZfY2lsaWF0ZWRfZ2Vub3R5cGUkcF92YWxfYWRqPDAuMDAxICYgYWJzKERFX0UxNl9jaWxpYXRlZF9nZW5vdHlwZSRhdmdfbG9nRkMpPjAuNSAmIGFicyhERV9FMTZfY2lsaWF0ZWRfZ2Vub3R5cGUkcGN0LjEtREVfRTE2X2NpbGlhdGVkX2dlbm90eXBlJHBjdC4yKT4wLjE1XQpgYGAKYGBge3J9CmxpYnJhcnkoZ2dyZXBlbCkKYGBgCmBgYHtyLGZpZy5oZWlnaHQ9OCxmaWcud2lkdGg9MTJ9CgojREVfUDRfc2VjcmV0b3J5X2dlbm90eXBlJHNpZzwtREVfUDRfc2VjcmV0b3J5X2dlbm90eXBlJHBfdmFsX2FkajwwLjAwMQpERV9FMTZfY2lsaWF0ZWRfZ2Vub3R5cGUkdGhyZXNob2xkPC0gaWZlbHNlKERFX0UxNl9jaWxpYXRlZF9nZW5vdHlwZSRhdmdfbG9nRkM+MCAmIERFX0UxNl9jaWxpYXRlZF9nZW5vdHlwZSRwX3ZhbF9hZGo8MC4wMDEsICJ3dF9lbnJpY2giLGlmZWxzZShERV9FMTZfY2lsaWF0ZWRfZ2Vub3R5cGUkYXZnX2xvZ0ZDPDAgJiBERV9FMTZfY2lsaWF0ZWRfZ2Vub3R5cGUkcF92YWxfYWRqPDAuMDAxLCAibXV0X2VucmljaCIsIk5vdFNpZ25pZmljYW50IiApICkKZ2dwbG90KERFX0UxNl9jaWxpYXRlZF9nZW5vdHlwZSwgYWVzKGF2Z19sb2dGQywgLWxvZzEwKHBfdmFsX2FkaikpKSArICN2b2xjYW5vcGxvdCB3aXRoIGF2Z19sb2dGQyB2ZXJzdXMgcF92YWxfYWRqCiAgICBnZW9tX3BvaW50KGFlcyhjb2w9dGhyZXNob2xkKSxzaXplPTAuMikgKyAjYWRkIHBvaW50cyBjb2xvcmVkIGJ5IHNpZ25pZmljYW5jZQogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXM9YygiZ3JlZW4iLCAiYmxhY2siLCJtYWdlbnRhIikpKwogICAgZ2d0aXRsZSgiRTE2Q2lsaWF0ZWRfd3QvbXV0IikgKyBnZW9tX3RleHRfcmVwZWwoZGF0YT1ERV9FMTZfY2lsaWF0ZWRfZ2Vub3R5cGVbREVfRTE2X2NpbGlhdGVkX2dlbm90eXBlJGdlbmUgJWluJSBFMTZfY2lsaWF0ZWRfYXV0b21hdGljX2dlbmVMaXN0LF0sIGFlcyhsYWJlbD1nZW5lKSwgcG9pbnQucGFkZGluZyA9IDEsIGJveC5wYWRkaW5nID0gLjMpICsKICBsYWJzKHkgPSBleHByZXNzaW9uKC1sb2dbMTBdKiIgIioiYWRqdXN0ZWQgcHZhbHVlIiksIHggPSAiYXZnIGxvZyBmb2xkIGNoYW5nZSIpICsgCiAgdGhlbWUobGVnZW5kLnRpdGxlID0gZWxlbWVudF9ibGFuaygpLCBsZWdlbmQucG9zaXRpb24gPSAidG9wIikgCmBgYAojIyMjIyBQQ0QgZ2VuZXMgYXJlIG5vdCBzaWduaWZpY2FudGx5IGRpZmZlcmVudGlhbGx5IGV4cHJlc3NlZCBiZXR3ZWVuIGdlbm90eXBlczoKYGBge3IsZmlnLmhlaWdodD04LGZpZy53aWR0aD0xMn0KCiNERV9QNF9zZWNyZXRvcnlfZ2Vub3R5cGUkc2lnPC1ERV9QNF9zZWNyZXRvcnlfZ2Vub3R5cGUkcF92YWxfYWRqPDAuMDAxCkRFX0UxNl9jaWxpYXRlZF9nZW5vdHlwZSR0aHJlc2hvbGQ8LSBpZmVsc2UoREVfRTE2X2NpbGlhdGVkX2dlbm90eXBlJGF2Z19sb2dGQz4wICYgREVfRTE2X2NpbGlhdGVkX2dlbm90eXBlJHBfdmFsX2FkajwwLjAwMSwgInd0X2VucmljaCIsaWZlbHNlKERFX0UxNl9jaWxpYXRlZF9nZW5vdHlwZSRhdmdfbG9nRkM8MCAmIERFX0UxNl9jaWxpYXRlZF9nZW5vdHlwZSRwX3ZhbF9hZGo8MC4wMDEsICJtdXRfZW5yaWNoIiwiTm90U2lnbmlmaWNhbnQiICkgKQpnZ3Bsb3QoREVfRTE2X2NpbGlhdGVkX2dlbm90eXBlLCBhZXMoYXZnX2xvZ0ZDLCAtbG9nMTAocF92YWxfYWRqKSkpICsgI3ZvbGNhbm9wbG90IHdpdGggYXZnX2xvZ0ZDIHZlcnN1cyBwX3ZhbF9hZGoKICAgIGdlb21fcG9pbnQoYWVzKGNvbD10aHJlc2hvbGQpLHNpemU9MC4yKSArICNhZGQgcG9pbnRzIGNvbG9yZWQgYnkgc2lnbmlmaWNhbmNlCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcz1jKCJncmVlbiIsICJibGFjayIsIm1hZ2VudGEiKSkrCiAgICBnZ3RpdGxlKCJFMTZDaWxpYXRlZF93dC9tdXQiKSArIGdlb21fdGV4dF9yZXBlbChkYXRhPURFX0UxNl9jaWxpYXRlZF9nZW5vdHlwZVtERV9FMTZfY2lsaWF0ZWRfZ2Vub3R5cGUkZ2VuZSAlaW4lIGdlbmVMaXN0JFByaW1hcnkuY2lsaWFyeS5keXNraW5lc2lhLF0sIGFlcyhsYWJlbD1nZW5lKSwgcG9pbnQucGFkZGluZyA9IDEsIGJveC5wYWRkaW5nID0gLjMpICsKICBsYWJzKHkgPSBleHByZXNzaW9uKC1sb2dbMTBdKiIgIioiYWRqdXN0ZWQgcHZhbHVlIiksIHggPSAiYXZnIGxvZyBmb2xkIGNoYW5nZSIpICsgCiAgdGhlbWUobGVnZW5kLnRpdGxlID0gZWxlbWVudF9ibGFuaygpLCBsZWdlbmQucG9zaXRpb24gPSAidG9wIikgCmBgYAoKYGBge3J9CgpERV9FMTZfY2lsaWF0ZWRfZ2Vub3R5cGVbREVfRTE2X2NpbGlhdGVkX2dlbm90eXBlJGdlbmUgJWluJSBnZW5lTGlzdCRQcmltYXJ5LmNpbGlhcnkuZHlza2luZXNpYSxdCmBgYApgYGB7cn0KCkRFX0UxNl9jaWxpYXRlZF9nZW5vdHlwZVtERV9FMTZfY2lsaWF0ZWRfZ2Vub3R5cGUkZ2VuZSAlaW4lIGdlbmVMaXN0JENpbGlvcGF0aHksXQpgYGAKCgpgYGB7cn0KZGZfRTE2X2VwaTwtRmV0Y2hEYXRhKEUxNl9EZWM3djNfZXBpLGMoIlNwZGVmIiwiQ3JlYjNsMSIsIlNjZ2IzYTIiLCJTY2diMWExIiwiS3J0NCIsIktydDEzIiwiRm94YTMiLCJBcXAzIiwiQXFwNCIsIkFxcDUiLCJHcDIiLCJTb3N0ZGMxIiwiU21vYzIiLCJLcnQxNCIsIktydDE1IiwiS3J0NSIsIlJhYzIiLCJDbGljMyIsInJlcy4xLjIiLCJyZXMuMS40IiwiZ2Vub3R5cGUiLCJzZXFfZ3JvdXAiLCJzcGVjaWZpY190eXBlIiwiY2VsbF90eXBlIiwiRGVmYjEiLCJMeXoyIiwiTHRmIiwiU2Z0cGExIiwiU2Z0cGQiLCJTZnRwYiIsIlNscGkiLCJMY24yIiwiUGlnciIsIk11YzViIiwiTXVjNWFjIiwiTXVjMSIsIk11YzIiLCJNdWM0IiwiTXVjMTYiLCJNdWMyMCIsIkxicCIsIkNkMTQiLCJUbHI0IiwiVGxyMiIsIk15ZDg4IiwiVGljYW0xIiwiSXRsbjEiLCJMZ2FsczMiLCJSZWczZyIsIk5vZDEiLCJOb2QyIiwiRGR4NTgiLCJJZmloMSIsIkRoeDU4IiwiQ2NsNSIsIkN4Y2wxMCIsIkN4Y2wyIiwiQ3hjbDEiLCJQZjQiLCJDeGNsMTIiLCJDeGNsMTQiLCJDeGNsMTUiLCJDeGNsMTYiLCJDeGNsMTciLCJDY2wyIiwiQ2NsNyIsIkNjbDE3IiwiQ2NsMjAiLCJDY2wyMWEiLCJDY2wyNSIsIkNjbDI3YSIsIkNjbDI4IiwiQ3gzY2wxIiwiSWwxMCIsIlRuZiIsIlMxMDBhOCIsIlMxMDBhOSIsIklsNiIsIklsMTgiLCJJbDFiIiwiSWwxcmwxIiwiQ2NsMTEiLCJDY2wyNCIsIklsMzMiLCJJbDI1IiwiVHNscCIsIkYycmwxIiwiUmV0bmxhIiwiQWxveDE1IiwiQWxveDUiLCJHYXRhMiIsIlRnZmIyIiwiVGdmYjEiLCJPcm1kbDMiLCJQdGdlcyIsIlB0Z2RzIiwiUHRnczIiLCJIcGdkcyIsIlRieGFzMSIsIkFyZWciLCJJZm5rIiwiSWZubHIxIiwiTmZrYml6IiwiTmZrYmlhIikpCgpgYGAKIyMjIyMgTWljcm9iaWFsU2Vuc2luZzoKYGBge3IsIGZpZy5oZWlnaHQ9MywgZmlnLndpZHRoPTd9CmZvciAoaSBpbiBjKCJMYnAiLCJDZDE0IiwiVGxyNCIsIlRscjIiLCJNeWQ4OCIsIlRpY2FtMSIsIkl0bG4xIiwiUmVnM2ciLCJMZ2FsczMiLCJOb2QxIiwiTm9kMiIsIkRkeDU4IiwiSWZpaDEiLCJEaHg1OCIpKQp7CnBkZihmaWxlID0gcGFzdGUoIk1hbnVzY3JpcHQvTWljcm9iaWFsU2Vuc2luZ19nZW5vdHlwZS9FMTYvIixpLCIucGRmIiwgc2VwID0gIiIpLCB3aWR0aCA9IDYsIGhlaWdodCA9IDUpCnByaW50KGdncGxvdChkZl9FMTZfZXBpLGFlc19zdHJpbmcoeD0iZ2Vub3R5cGUiLHk9aSkpK2ZhY2V0X2dyaWQoLn5jZWxsX3R5cGUpK2dlb21fZG90cGxvdChiaW5heGlzPSJ5IixhZXMoZmlsbD1nZW5vdHlwZSksYmlud2lkdGg9MC4wNSxzdGFja2Rpcj0iY2VudGVyIixwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSgwLjgpLCBkb3RzaXplPTAuMikrc3RhdF9jb21wYXJlX21lYW5zKGNvbXBhcmlzb25zID0gbGlzdChjKCJ3dCIsICJtdXQiKSksbWV0aG9kPSJ3aWxjb3gudGVzdCIsc2l6ZT00LGxhYmVsPSJwLmFkaiIpKyBzdGF0X3N1bW1hcnkoYWVzKGNvbG9yPWdlbm90eXBlKSxmdW4uZGF0YT1tZWFuX3NkbCwgZnVuLmFyZ3MgPSBsaXN0KG11bHQ9MSksIAogICAgICAgICAgICAgICAgIGdlb209InBvaW50cmFuZ2UiLHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKDAuNykpKyB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LGhqdXN0PTEpLHN0cmlwLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gOSwgY29sb3VyID0gImJsYWNrIiwgYW5nbGUgPSAwKSkpCmRldi5vZmYoKQp9CmBgYAoKIyMjIyMgYW50aW1pY3JvYmlhbCBlZmZlY3RvcnM6CmBgYHtyLCBmaWcuaGVpZ2h0PTMsIGZpZy53aWR0aD03fQpmb3IgKGkgaW4gYygiTXVjMSIsIk11YzQiLCJNdWMxNiIsIk11YzIwIiwiTXVjNWIiLCJNdWM1YWMiLCJNdWMyIiwiRGVmYjEiLCJMeXoyIiwiTHRmIiwiU2Z0cGExIiwiU2Z0cGQiLCJTZnRwYiIsIlNscGkiLCJMY24yIiwiUGlnciIsIkNoaWw0IikpCnsKcGRmKGZpbGUgPSBwYXN0ZSgiTWFudXNjcmlwdC9FZmZlY3RvcnNfZ2Vub3R5cGUvRTE2LyIsaSwiLnBkZiIsIHNlcCA9ICIiKSwgd2lkdGggPSA2LCBoZWlnaHQgPSA1KQpwcmludChnZ3Bsb3QoZGZfRTE2X2VwaSxhZXNfc3RyaW5nKHg9Imdlbm90eXBlIix5PWkpKStmYWNldF9ncmlkKC5+Y2VsbF90eXBlKStnZW9tX2RvdHBsb3QoYmluYXhpcz0ieSIsYWVzKGZpbGw9Z2Vub3R5cGUpLGJpbndpZHRoPTAuMDUsc3RhY2tkaXI9ImNlbnRlciIscG9zaXRpb249cG9zaXRpb25fZG9kZ2UoMC44KSwgZG90c2l6ZT0wLjIpK3N0YXRfY29tcGFyZV9tZWFucyhjb21wYXJpc29ucyA9IGxpc3QoYygid3QiLCAibXV0IikpLG1ldGhvZD0id2lsY294LnRlc3QiLHNpemU9NCxsYWJlbD0icC5hZGoiKSsgc3RhdF9zdW1tYXJ5KGFlcyhjb2xvcj1nZW5vdHlwZSksZnVuLmRhdGE9bWVhbl9zZGwsIGZ1bi5hcmdzID0gbGlzdChtdWx0PTEpLCAKICAgICAgICAgICAgICAgICBnZW9tPSJwb2ludHJhbmdlIixwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSgwLjcpKSsgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSxoanVzdD0xKSxzdHJpcC50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDksIGNvbG91ciA9ICJibGFjayIsIGFuZ2xlID0gMCkpKQpkZXYub2ZmKCkKfQpgYGAKIyMjIyMgY2hlbW9raW5lczoKYGBge3IsIGZpZy5oZWlnaHQ9MywgZmlnLndpZHRoPTd9CmZvciAoaSBpbiBjKCJDY2w1IiwiQ3hjbDEwIiwiQ3hjbDIiLCJDeGNsMSIsIlBmNCIsIkN4Y2wxMiIsIkN4Y2wxNCIsIkN4Y2wxNSIsIkN4Y2wxNiIsIkN4Y2wxNyIsIkNjbDIiLCJDY2w3IiwiQ2NsMTciLCJDY2wyMCIsIkNjbDIxYSIsIkNjbDI1IiwiQ2NsMjdhIiwiQ2NsMjgiLCJDeDNjbDEiKSkKewpwZGYoZmlsZSA9IHBhc3RlKCJNYW51c2NyaXB0L2NoZW1va2luZXNfZ2Vub3R5cGUvRTE2LyIsaSwiLnBkZiIsIHNlcCA9ICIiKSwgd2lkdGggPSA2LCBoZWlnaHQgPSA1KQpwcmludChnZ3Bsb3QoZGZfRTE2X2VwaSxhZXNfc3RyaW5nKHg9Imdlbm90eXBlIix5PWkpKStmYWNldF9ncmlkKC5+Y2VsbF90eXBlKStnZW9tX2RvdHBsb3QoYmluYXhpcz0ieSIsYWVzKGZpbGw9Z2Vub3R5cGUpLGJpbndpZHRoPTAuMDUsc3RhY2tkaXI9ImNlbnRlciIscG9zaXRpb249cG9zaXRpb25fZG9kZ2UoMC44KSwgZG90c2l6ZT0wLjIpK3N0YXRfY29tcGFyZV9tZWFucyhjb21wYXJpc29ucyA9IGxpc3QoYygid3QiLCAibXV0IikpLG1ldGhvZD0id2lsY294LnRlc3QiLHNpemU9NCxsYWJlbD0icC5hZGoiKSsgc3RhdF9zdW1tYXJ5KGFlcyhjb2xvcj1nZW5vdHlwZSksZnVuLmRhdGE9bWVhbl9zZGwsIGZ1bi5hcmdzID0gbGlzdChtdWx0PTEpLCAKICAgICAgICAgICAgICAgICBnZW9tPSJwb2ludHJhbmdlIixwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSgwLjcpKSsgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSxoanVzdD0xKSxzdHJpcC50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDksIGNvbG91ciA9ICJibGFjayIsIGFuZ2xlID0gMCkpKQpkZXYub2ZmKCkKfQpgYGAKIyMjIyMgVGgyOgpgYGB7ciwgZmlnLmhlaWdodD0zLCBmaWcud2lkdGg9N30KZm9yIChpIGluIGMoIklsMTAiLCJUbmYiLCJTMTAwYTgiLCJTMTAwYTkiLCJJbDYiLCJJbDE4IiwiSWwxYiIsIklsMXJsMSIsIkNjbDExIiwiQ2NsMjQiLCJJbDMzIiwiSWwyNSIsIlRzbHAiLCJGMnJsMSIsIlJldG5sYSIsIkFsb3gxNSIsIkFsb3g1IiwiR2F0YTIiLCJUZ2ZiMiIsIlRnZmIxIiwiT3JtZGwzIiwiUHRnZXMiLCJQdGdkcyIsIlB0Z3MyIiwiSHBnZHMiLCJUYnhhczEiLCJBcmVnIikpCnsKcGRmKGZpbGUgPSBwYXN0ZSgiTWFudXNjcmlwdC9UaDJfZ2Vub3R5cGUvRTE2LyIsaSwiLnBkZiIsIHNlcCA9ICIiKSwgd2lkdGggPSA2LCBoZWlnaHQgPSA1KQpwcmludChnZ3Bsb3QoZGZfRTE2X2VwaSxhZXNfc3RyaW5nKHg9Imdlbm90eXBlIix5PWkpKStmYWNldF9ncmlkKC5+Y2VsbF90eXBlKStnZW9tX2RvdHBsb3QoYmluYXhpcz0ieSIsYWVzKGZpbGw9Z2Vub3R5cGUpLGJpbndpZHRoPTAuMDUsc3RhY2tkaXI9ImNlbnRlciIscG9zaXRpb249cG9zaXRpb25fZG9kZ2UoMC44KSwgZG90c2l6ZT0wLjIpK3N0YXRfY29tcGFyZV9tZWFucyhjb21wYXJpc29ucyA9IGxpc3QoYygid3QiLCAibXV0IikpLG1ldGhvZD0id2lsY294LnRlc3QiLHNpemU9NCxsYWJlbD0icC5hZGoiKSsgc3RhdF9zdW1tYXJ5KGFlcyhjb2xvcj1nZW5vdHlwZSksZnVuLmRhdGE9bWVhbl9zZGwsIGZ1bi5hcmdzID0gbGlzdChtdWx0PTEpLCAKICAgICAgICAgICAgICAgICBnZW9tPSJwb2ludHJhbmdlIixwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSgwLjcpKSsgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSxoanVzdD0xKSxzdHJpcC50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDksIGNvbG91ciA9ICJibGFjayIsIGFuZ2xlID0gMCkpKQpkZXYub2ZmKCkKfQpgYGAKCgpgYGB7ciwgZmlnLmhlaWdodD01LCBmaWcud2lkdGg9MTB9CmxpYnJhcnkoZ2dwdWJyKQoKZ2dwbG90KGRmX0UxNl9lcGlbIShkZl9FMTZfZXBpJHNwZWNpZmljX3R5cGU9PSJEb3VibGV0IiksXSxhZXMoZ2Vub3R5cGUsTXVjMikpK2ZhY2V0X2dyaWQoLn5zcGVjaWZpY190eXBlKStnZW9tX2RvdHBsb3QoYmluYXhpcz0ieSIsYWVzKGZpbGw9Z2Vub3R5cGUpLGJpbndpZHRoPTAuMDUsc3RhY2tkaXI9ImNlbnRlciIscG9zaXRpb249cG9zaXRpb25fZG9kZ2UoMC44KSwgZG90c2l6ZT0wLjIpK3N0YXRfY29tcGFyZV9tZWFucyhjb21wYXJpc29ucyA9IGxpc3QoYygid3QiLCAibXV0IikpLG1ldGhvZD0id2lsY294LnRlc3QiLHNpemU9NCxsYWJlbD0icC5hZGoiKSsgc3RhdF9zdW1tYXJ5KGFlcyhjb2xvcj1nZW5vdHlwZSksZnVuLmRhdGE9bWVhbl9zZGwsIGZ1bi5hcmdzID0gbGlzdChtdWx0PTEpLCAKICAgICAgICAgICAgICAgICBnZW9tPSJwb2ludHJhbmdlIixwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSgwLjcpKSsgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSxoanVzdD0xKSxzdHJpcC50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDksIGNvbG91ciA9ICJibGFjayIsIGFuZ2xlID0gMCkpCmBgYAoKCmBgYHtyLCBmaWcuaGVpZ2h0PTUsIGZpZy53aWR0aD0xMH0KCmdncGxvdChkZl9FMTZfZXBpWyEoZGZfRTE2X2VwaSRzcGVjaWZpY190eXBlPT0iRG91YmxldCIpLF0sYWVzKGdlbm90eXBlLFNmdHBiKSkrZmFjZXRfZ3JpZCgufnNwZWNpZmljX3R5cGUpK2dlb21fZG90cGxvdChiaW5heGlzPSJ5IixhZXMoZmlsbD1nZW5vdHlwZSksYmlud2lkdGg9MC4wNSxzdGFja2Rpcj0iY2VudGVyIixwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSgwLjgpLCBkb3RzaXplPTAuMikrc3RhdF9jb21wYXJlX21lYW5zKGNvbXBhcmlzb25zID0gbGlzdChjKCJ3dCIsICJtdXQiKSksbWV0aG9kPSJ3aWxjb3gudGVzdCIsc2l6ZT00LGxhYmVsPSJwLmFkaiIpKyBzdGF0X3N1bW1hcnkoYWVzKGNvbG9yPWdlbm90eXBlKSxmdW4uZGF0YT1tZWFuX3NkbCwgZnVuLmFyZ3MgPSBsaXN0KG11bHQ9MSksIAogICAgICAgICAgICAgICAgIGdlb209InBvaW50cmFuZ2UiLHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKDAuNykpKyB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LGhqdXN0PTEpLHN0cmlwLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gOSwgY29sb3VyID0gImJsYWNrIiwgYW5nbGUgPSAwKSkKYGBgCmBgYHtyLCBmaWcuaGVpZ2h0PTUsIGZpZy53aWR0aD0xMH0KCmdncGxvdChkZl9FMTZfZXBpWyEoZGZfRTE2X2VwaSRzcGVjaWZpY190eXBlPT0iRG91YmxldCIpLF0sYWVzKGdlbm90eXBlLFNjZ2IzYTIpKStmYWNldF9ncmlkKC5+c3BlY2lmaWNfdHlwZSkrZ2VvbV9kb3RwbG90KGJpbmF4aXM9InkiLGFlcyhmaWxsPWdlbm90eXBlKSxiaW53aWR0aD0wLjA1LHN0YWNrZGlyPSJjZW50ZXIiLHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKDAuOCksIGRvdHNpemU9MC4yKStzdGF0X2NvbXBhcmVfbWVhbnMoY29tcGFyaXNvbnMgPSBsaXN0KGMoInd0IiwgIm11dCIpKSxtZXRob2Q9IndpbGNveC50ZXN0IixzaXplPTQsbGFiZWw9InAuYWRqIikrIHN0YXRfc3VtbWFyeShhZXMoY29sb3I9Z2Vub3R5cGUpLGZ1bi5kYXRhPW1lYW5fc2RsLCBmdW4uYXJncyA9IGxpc3QobXVsdD0xKSwgCiAgICAgICAgICAgICAgICAgZ2VvbT0icG9pbnRyYW5nZSIscG9zaXRpb249cG9zaXRpb25fZG9kZ2UoMC43KSkrIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsaGp1c3Q9MSkpCmBgYApgYGB7ciwgZmlnLmhlaWdodD01LCBmaWcud2lkdGg9MTB9CgpnZ3Bsb3QoZGZfRTE2X2VwaVshKGRmX0UxNl9lcGkkc3BlY2lmaWNfdHlwZT09IkRvdWJsZXQiKSxdLGFlcyhnZW5vdHlwZSxTY2diMWExKSkrZmFjZXRfZ3JpZCgufnNwZWNpZmljX3R5cGUpK2dlb21fZG90cGxvdChiaW5heGlzPSJ5IixhZXMoZmlsbD1nZW5vdHlwZSksYmlud2lkdGg9MC4wNSxzdGFja2Rpcj0iY2VudGVyIixwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSgwLjgpLCBkb3RzaXplPTAuMikrc3RhdF9jb21wYXJlX21lYW5zKGNvbXBhcmlzb25zID0gbGlzdChjKCJ3dCIsICJtdXQiKSksbWV0aG9kPSJ3aWxjb3gudGVzdCIsc2l6ZT00LGxhYmVsPSJwLmFkaiIpKyBzdGF0X3N1bW1hcnkoYWVzKGNvbG9yPWdlbm90eXBlKSxmdW4uZGF0YT1tZWFuX3NkbCwgZnVuLmFyZ3MgPSBsaXN0KG11bHQ9MSksIAogICAgICAgICAgICAgICAgIGdlb209InBvaW50cmFuZ2UiLHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKDAuNykpKyB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LGhqdXN0PTEpLHN0cmlwLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gOSwgY29sb3VyID0gImJsYWNrIiwgYW5nbGUgPSAwKSkKYGBgCmBgYHtyLCBmaWcuaGVpZ2h0PTUsIGZpZy53aWR0aD0xMH0KCmdncGxvdChkZl9FMTZfZXBpWyEoZGZfRTE2X2VwaSRzcGVjaWZpY190eXBlPT0iRG91YmxldCIpLF0sYWVzKGdlbm90eXBlLFNvc3RkYzEpKStmYWNldF9ncmlkKC5+c3BlY2lmaWNfdHlwZSkrZ2VvbV9kb3RwbG90KGJpbmF4aXM9InkiLGFlcyhmaWxsPWdlbm90eXBlKSxiaW53aWR0aD0wLjA1LHN0YWNrZGlyPSJjZW50ZXIiLHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKDAuOCksIGRvdHNpemU9MC4yKStzdGF0X2NvbXBhcmVfbWVhbnMoY29tcGFyaXNvbnMgPSBsaXN0KGMoInd0IiwgIm11dCIpKSxtZXRob2Q9IndpbGNveC50ZXN0IixzaXplPTQsbGFiZWw9InAuYWRqIikrIHN0YXRfc3VtbWFyeShhZXMoY29sb3I9Z2Vub3R5cGUpLGZ1bi5kYXRhPW1lYW5fc2RsLCBmdW4uYXJncyA9IGxpc3QobXVsdD0xKSwgCiAgICAgICAgICAgICAgICAgZ2VvbT0icG9pbnRyYW5nZSIscG9zaXRpb249cG9zaXRpb25fZG9kZ2UoMC43KSkrIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsaGp1c3Q9MSksc3RyaXAudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSA5LCBjb2xvdXIgPSAiYmxhY2siLCBhbmdsZSA9IDApKQpgYGAKYGBge3IsIGZpZy5oZWlnaHQ9NSwgZmlnLndpZHRoPTEwfQoKZ2dwbG90KGRmX0UxNl9lcGlbIShkZl9FMTZfZXBpJHNwZWNpZmljX3R5cGU9PSJEb3VibGV0IiksXSxhZXMoZ2Vub3R5cGUsU21vYzIpKStmYWNldF9ncmlkKC5+c3BlY2lmaWNfdHlwZSkrZ2VvbV9kb3RwbG90KGJpbmF4aXM9InkiLGFlcyhmaWxsPWdlbm90eXBlKSxiaW53aWR0aD0wLjA1LHN0YWNrZGlyPSJjZW50ZXIiLHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKDAuOCksIGRvdHNpemU9MC4yKStzdGF0X2NvbXBhcmVfbWVhbnMoY29tcGFyaXNvbnMgPSBsaXN0KGMoInd0IiwgIm11dCIpKSxtZXRob2Q9IndpbGNveC50ZXN0IixzaXplPTQsbGFiZWw9InAuYWRqIikrIHN0YXRfc3VtbWFyeShhZXMoY29sb3I9Z2Vub3R5cGUpLGZ1bi5kYXRhPW1lYW5fc2RsLCBmdW4uYXJncyA9IGxpc3QobXVsdD0xKSwgCiAgICAgICAgICAgICAgICAgZ2VvbT0icG9pbnRyYW5nZSIscG9zaXRpb249cG9zaXRpb25fZG9kZ2UoMC43KSkrIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsaGp1c3Q9MSksc3RyaXAudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSA5LCBjb2xvdXIgPSAiYmxhY2siLCBhbmdsZSA9IDApKQpgYGAKCmBgYHtyLCBmaWcuaGVpZ2h0PTUsIGZpZy53aWR0aD0xMH0KCmdncGxvdChkZl9FMTZfZXBpWyEoZGZfRTE2X2VwaSRjZWxsX3R5cGU9PSJEb3VibGV0IiksXSxhZXMoZ2Vub3R5cGUsTmZrYml6KSkrZmFjZXRfZ3JpZCgufmNlbGxfdHlwZSkrZ2VvbV9kb3RwbG90KGJpbmF4aXM9InkiLGFlcyhmaWxsPWdlbm90eXBlKSxiaW53aWR0aD0wLjA1LHN0YWNrZGlyPSJjZW50ZXIiLHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKDAuOCksIGRvdHNpemU9MC4yKStzdGF0X2NvbXBhcmVfbWVhbnMoY29tcGFyaXNvbnMgPSBsaXN0KGMoInd0IiwgIm11dCIpKSxtZXRob2Q9IndpbGNveC50ZXN0IixzaXplPTQsbGFiZWw9InAuYWRqIikrIHN0YXRfc3VtbWFyeShhZXMoY29sb3I9Z2Vub3R5cGUpLGZ1bi5kYXRhPW1lYW5fc2RsLCBmdW4uYXJncyA9IGxpc3QobXVsdD0xKSwgCiAgICAgICAgICAgICAgICAgZ2VvbT0icG9pbnRyYW5nZSIscG9zaXRpb249cG9zaXRpb25fZG9kZ2UoMC43KSkrIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsaGp1c3Q9MSksc3RyaXAudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSA5LCBjb2xvdXIgPSAiYmxhY2siLCBhbmdsZSA9IDApKQpgYGAKCgojIyMjIyBleHBsb3JlIGdlbmVzIGNvcnJlbGF0ZWQgd2l0aCBiYXNhbC0tPnNlY3JldG9yeSBjaGFuZ2VzOgojIyMjIyBjMyBpcyB0aGUgYmFzYWwvc2VjcmV0b3J5IHBvcHVsYXRpb24KYGBge3J9CkUxNl9EZWM3djNfZXBpIDwtIFNldEFsbElkZW50KG9iamVjdCA9IEUxNl9EZWM3djNfZXBpLCBpZCA9ICJyZXMuMS40IikKRTE2X0RlYzd2M19lcGlfc3ViYzM8LVN1YnNldERhdGEob2JqZWN0PUUxNl9EZWM3djNfZXBpLGlkZW50LnVzZT1jKDMpKQp0YWJsZShFMTZfRGVjN3YzX2VwaV9zdWJjM0BtZXRhLmRhdGEkcmVzLjEuNCkKYGBgCmBgYHtyfQpFMTZfRGVjN3YzX2VwaV9zdWJjM0BtZXRhLmRhdGE8LUUxNl9EZWM3djNfZXBpX3N1YmMzQG1ldGEuZGF0YVssLXdoaWNoKG5hbWVzKEUxNl9EZWM3djNfZXBpX3N1YmMzQG1ldGEuZGF0YSkgJWluJSBjKCJyZXMuMC44IiwgInJlcy4xLjIiLCAicmVzLjEuNCIsICJyZXMuMS42IikpXSAjcmVtb3ZlIG9sZCBtZXRhZGF0YQpFMTZfRGVjN3YzX2VwaV9zdWJjMyA8LSBTY2FsZURhdGEob2JqZWN0ID0gRTE2X0RlYzd2M19lcGlfc3ViYzMpCmBgYApgYGB7cn0KRTE2X0RlYzd2M19lcGlfc3ViYzMgPC0gRmluZFZhcmlhYmxlR2VuZXMob2JqZWN0ID0gRTE2X0RlYzd2M19lcGlfc3ViYzMsIGRvLnBsb3QgPSBUUlVFLCB4Lmxvdy5jdXRvZmY9MC4xLHguaGlnaC5jdXRvZmYgPSBJbmYsIHkuY3V0b2ZmID0gMC41KQpgYGAKCmBgYHtyfQpFMTZfRGVjN3YzX2VwaV9zdWJjMyA8LSBSdW5QQ0Eob2JqZWN0ID0gRTE2X0RlYzd2M19lcGlfc3ViYzMsIGRvLnByaW50ID0gRkFMU0UpClBDQVBsb3QoRTE2X0RlYzd2M19lcGlfc3ViYzMpCmBgYAoKYGBge3J9CkUxNl9EZWM3djNfZXBpX3N1YmMzIDwtIFByb2plY3RQQ0Eob2JqZWN0ID0gRTE2X0RlYzd2M19lcGlfc3ViYzMsIGRvLnByaW50ID0gVFJVRSkKYGBgCgpgYGB7cn0KUENFbGJvd1Bsb3Qob2JqZWN0ID0gRTE2X0RlYzd2M19lcGlfc3ViYzMpCmBgYApgYGB7cn0Kbi5wY3Muc3ViMyA9IDEzCmBgYAojIyMjI3Jlc29sdXRpb24gcGFyYW1ldGVyIHNldHMgdGhlIOKAmGdyYW51bGFyaXR54oCZIG9mIHRoZSBkb3duc3RyZWFtIGNsdXN0ZXJpbmcsIHdpdGggaW5jcmVhc2VkIHZhbHVlcyBsZWFkaW5nIHRvIGEgZ3JlYXRlciBudW1iZXIgb2YgY2x1c3RlcnMuIApgYGB7cn0KcmVzLnVzZWQgPC0gMS4yCmBgYAoKYGBge3J9CkUxNl9EZWM3djNfZXBpX3N1YmMzIDwtIEZpbmRDbHVzdGVycyhvYmplY3QgPSBFMTZfRGVjN3YzX2VwaV9zdWJjMywgcmVkdWN0aW9uLnR5cGUgPSAicGNhIiwgZGltcy51c2UgPSAxOm4ucGNzLnN1YjMsIAogICAgICAgICAgICAgICAgICAgICByZXNvbHV0aW9uID0gcmVzLnVzZWQsIHByaW50Lm91dHB1dCA9IDAsIGZvcmNlLnJlY2FsYyA9IFQpCmBgYApgYGB7cn0KRTE2X0RlYzd2M19lcGlfc3ViYzMgPC0gUnVuVFNORShvYmplY3QgPSBFMTZfRGVjN3YzX2VwaV9zdWJjMywgZGltcy51c2UgPSAxOm4ucGNzLnN1YjMsIHBlcnBsZXhpdHk9MzApCmBgYApgYGB7cn0KVFNORVBsb3Qob2JqZWN0ID0gRTE2X0RlYzd2M19lcGlfc3ViYzMsIGRvLmxhYmVsID0gVCkKYGBgCmBgYHtyfQpyZXMudXNlZCA8LSAwLjgKYGBgCmBgYHtyfQpUU05FUGxvdChvYmplY3QgPSBFMTZfRGVjN3YzX2VwaV9zdWJjMywgZG8ubGFiZWwgPSBUKQpgYGAKCmBgYHtyfQpyZXMudXNlZCA8LSAwLjYKYGBgCmBgYHtyfQpUU05FUGxvdChvYmplY3QgPSBFMTZfRGVjN3YzX2VwaV9zdWJjMywgZG8ubGFiZWwgPSBUKQpgYGAKYGBge3IsZmlnLmhlaWdodD04LGZpZy53aWR0aD0zMH0KRTE2X0RlYzd2M19lcGlfc3ViYzMgPC0gU2V0QWxsSWRlbnQob2JqZWN0ID0gRTE2X0RlYzd2M19lcGlfc3ViYzMsIGlkID0gInJlcy4wLjYiKQpEb0hlYXRtYXAob2JqZWN0ID0gRTE2X0RlYzd2M19lcGlfc3ViYzMsIGdlbmVzLnVzZSA9IGMoIkVwY2FtIiwiS3J0OCIsIlRycDYzIiwiS3J0NSIsIk1raTY3IiwiVG9wMmEiLCJTbW9jMiIsIkNjbDIwIiwiU29zdGRjMSIsIkJtcDciLCJDbGljMyIsIkNsZG4xMCIsIlRzcGFuMzMiLCJFaGYiLCJTZnRhMiIsIkNyaXAyIiwiTXNsbiIsIkN5cDJzMSIsIkNsZG4zIiwiQ2xkbjciLCJDbGRuNCIsIkFVMDIxMDkyIiwiVHNwYW4xIiwiQ2hhZCIsIlRzcGFuMTMiLCJLbGsxMCIsIktsazExIiwiS2xrMTMiLCJDZXMxZCIsIktydDQiLCJLcnQxMyIsIkNyZWIzbDEiKSwgCiAgICBzbGltLmNvbC5sYWJlbCA9IFRSVUUsIGdyb3VwLmxhYmVsLnJvdCA9IFRSVUUsdXNlLnNjYWxlZCA9IFQKICApCmBgYApgYGB7cn0KY29yKEUxNl9EZWM3djNfZXBpX3N1YmMzQHNjYWxlLmRhdGFbIlRycDYzIixdLCBFMTZfRGVjN3YzX2VwaV9zdWJjM0BzY2FsZS5kYXRhWyJDcmViM2wxIixdKQpgYGAKYGBge3J9CmNvcihFMTZfRGVjN3YzX2VwaV9zdWJjM0BkYXRhWyJUcnA2MyIsXSwgRTE2X0RlYzd2M19lcGlfc3ViYzNAZGF0YVsiU3BkZWYiLF0pCmBgYApgYGB7cn0KVHJwNjNfY29yPC1hcHBseShFMTZfRGVjN3YzX2VwaV9zdWJjM0BzY2FsZS5kYXRhLCAxLCBmdW5jdGlvbih4KSBjb3IoRTE2X0RlYzd2M19lcGlfc3ViYzNAc2NhbGUuZGF0YVsiVHJwNjMiLF0seCkpIApgYGAKYGBge3J9CmhlYWQoVHJwNjNfY29yKSAKYGBgCmBgYHtyfQptaW4oVHJwNjNfY29yLG5hLnJtID0gVCkgCmBgYApgYGB7cn0KVHJwNjNfY29yX29yZGVyPC1vcmRlcihUcnA2M19jb3IsZGVjcmVhc2luZz1UKSAKYGBgCmBgYHtyfQpoZWFkKFRycDYzX2NvcltUcnA2M19jb3Jfb3JkZXJdLDIwKQpgYGAKYGBge3J9CnN1bShpcy5uYShUcnA2M19jb3JbVHJwNjNfY29yX29yZGVyXSkpCmBgYApgYGB7cn0KVHJwNjNfY29yW1RycDYzX2Nvcl9vcmRlcl1bMTU3MDY6MTU2ODZdCmBgYApgYGB7cn0KdGFpbChUcnA2M19jb3JbVHJwNjNfY29yX29yZGVyXSwyMCkKYGBgCgoKCmBgYHtyfQpjb3IudGVzdChFMTZfRGVjN3YzX2VwaV9zdWJjM0BzY2FsZS5kYXRhWyJTcGRlZiIsXSwgRTE2X0RlYzd2M19lcGlfc3ViYzNAc2NhbGUuZGF0YVsiVHJwNjMiLF0sbWV0aG9kPSJwZWFyc29uIikKYGBgCgpgYGB7cn0KY29yLnRlc3QoRTE2X0RlYzd2M19lcGlfc3ViYzNAc2NhbGUuZGF0YVsiU3BkZWYiLF0sIEUxNl9EZWM3djNfZXBpX3N1YmMzQHNjYWxlLmRhdGFbIlRycDYzIixdLG1ldGhvZD0ia2VuZGFsbCIpCmBgYAoKYGBge3J9ClRycDYzX2Nvcl90ZXN0PC1hcHBseShFMTZfRGVjN3YzX2VwaV9zdWJjM0BzY2FsZS5kYXRhLCAxLCBmdW5jdGlvbih4KSBjb3IudGVzdChFMTZfRGVjN3YzX2VwaV9zdWJjM0BzY2FsZS5kYXRhWyJUcnA2MyIsXSx4LG1ldGhvZD0icGVhcnNvbiIpKSAKYGBgCmBgYHtyfQpkZl9UcnA2M19jb3JUZXN0PC1hcy5kYXRhLmZyYW1lKGRvLmNhbGwocmJpbmQsIFRycDYzX2Nvcl90ZXN0KSkKCmBgYApgYGB7cn0KZGZfb3JkZXJfVHJwNjNfY29yVGVzdDwtZGZfVHJwNjNfY29yVGVzdFtvcmRlcih1bmxpc3QoZGZfVHJwNjNfY29yVGVzdCRlc3RpbWF0ZSkpLF0KYGBgCmBgYHtyfQp0aWR5X1RycDYzX2NvcjwtY2JpbmQoZGZfb3JkZXJfVHJwNjNfY29yVGVzdCRlc3RpbWF0ZSxkZl9vcmRlcl9UcnA2M19jb3JUZXN0JHAudmFsdWUpCmBgYAoKYGBge3J9CmNvbG5hbWVzKHRpZHlfVHJwNjNfY29yKTwtYygiY29yIiwicC52YWx1ZSIpCmBgYAoKYGBge3J9CmhlYWQodGlkeV9UcnA2M19jb3IsMjApCmBgYApgYGB7cn0KdGlkeV9UcnA2M19jb3JbMTU3MDY6MTU2ODYsXQpgYGAKYGBge3J9CnRhaWwodGlkeV9UcnA2M19jb3IpCmBgYAoKYGBge3J9CktydDhfY29yX3Rlc3Q8LWFwcGx5KEUxNl9EZWM3djNfZXBpX3N1YmMzQHNjYWxlLmRhdGEsIDEsIGZ1bmN0aW9uKHgpIGNvci50ZXN0KEUxNl9EZWM3djNfZXBpX3N1YmMzQHNjYWxlLmRhdGFbIktydDgiLF0seCxtZXRob2Q9InBlYXJzb24iKSkgCmBgYAoKYGBge3J9CmRmX0tydDhfY29yVGVzdDwtYXMuZGF0YS5mcmFtZShkby5jYWxsKHJiaW5kLCBLcnQ4X2Nvcl90ZXN0KSkKCmBgYApgYGB7cn0KZGZfb3JkZXJfS3J0OF9jb3JUZXN0PC1kZl9LcnQ4X2NvclRlc3Rbb3JkZXIodW5saXN0KGRmX0tydDhfY29yVGVzdCRlc3RpbWF0ZSkpLF0KYGBgCmBgYHtyfQpzdW0oaXMubmEoZGZfb3JkZXJfS3J0OF9jb3JUZXN0JGVzdGltYXRlKSkKYGBgCgpgYGB7cn0KdGlkeV9LcnQ4X2NvcjwtY2JpbmQoZGZfb3JkZXJfS3J0OF9jb3JUZXN0JGVzdGltYXRlLGRmX29yZGVyX0tydDhfY29yVGVzdCRwLnZhbHVlKQpgYGAKCmBgYHtyfQpjb2xuYW1lcyh0aWR5X0tydDhfY29yKTwtYygiY29yIiwicC52YWx1ZSIpCmBgYAoKYGBge3J9CmhlYWQodGlkeV9LcnQ4X2NvciwyMCkKYGBgCmBgYHtyfQp0aWR5X0tydDhfY29yWzE1NjY2OjE1NzA2LF0KYGBgCgpgYGB7cn0KY29yLnRlc3QoRTE2X0RlYzd2M19lcGlfc3ViYzNAc2NhbGUuZGF0YVsiS3J0OCIsRTE2X0RlYzd2M19lcGlfc3ViYzNAbWV0YS5kYXRhJGdlbm90eXBlPT0id3QiXSwgRTE2X0RlYzd2M19lcGlfc3ViYzNAc2NhbGUuZGF0YVsiTnVtYiIsRTE2X0RlYzd2M19lcGlfc3ViYzNAbWV0YS5kYXRhJGdlbm90eXBlPT0id3QiXSxtZXRob2Q9InBlYXJzb24iKQpgYGAKYGBge3J9CmNvci50ZXN0KEUxNl9EZWM3djNfZXBpX3N1YmMzQHNjYWxlLmRhdGFbIktydDgiLEUxNl9EZWM3djNfZXBpX3N1YmMzQG1ldGEuZGF0YSRnZW5vdHlwZT09Im11dCJdLCBFMTZfRGVjN3YzX2VwaV9zdWJjM0BzY2FsZS5kYXRhWyJOdW1iIixFMTZfRGVjN3YzX2VwaV9zdWJjM0BtZXRhLmRhdGEkZ2Vub3R5cGU9PSJtdXQiXSxtZXRob2Q9InBlYXJzb24iKQpgYGAKCgoKCgoKCgoKCgoKCgoKCg==